当前位置: 首页 > article >正文

java虚拟机2

 

一、垃圾回收机制(GC)

 

1. 回收区域:GC主要回收堆内存区域。堆用于存放new出来的对象 。程序计数器、元数据区和栈一般不是GC回收的重点区域。

2. 回收单位:GC以对象为单位回收内存,而非字节。按对象维度回收更简便,若按字节维度则需详细描述对象各部分是否回收,较为复杂。

3. 对象存活判定 - 可达性分析:Java通过可达性分析判定对象是否可被回收。从GC roots(如栈上的局部变量、常量池里指向的对象、元数据区的静态成员等)开始扫描,能被访问到的对象标记为可达,不可达的对象则可被回收。如在构建二叉树的代码示例中,通过改变引用关系可使某些对象变得不可达从而可被回收 。

4. 回收算法

- 标记 - 清除:先标记可回收对象,再直接释放其内存。优点是简单直接,缺点是会产生内存碎片。

- 复制:将存活对象复制到另一块空间,然后释放原空间。可解决内存碎片问题,但存在内存浪费,且复制开销大,尤其在存活对象多的情况下。

- 标记 - 整理:先标记可回收对象,然后将存活对象向一端移动,再释放边界外的内存。能解决内存碎片问题,也避免复制算法的内存浪费,但搬运对象成本较高。

- 分代回收:将堆空间分为新生代和老年代。新生代对象生命周期短,多采用复制算法,新创建对象放伊甸区,经过GC存活的对象进入幸存区,多次GC后仍存活的对象进入老年代。老年代对象生命周期长,采用标记 - 清除或标记 - 整理算法 。涉及minor GC(新生代高频回收)、major GC(老年代低频回收)和Full GC(整堆回收) 。

 

二、类加载机制

 

1. 类加载流程

- 加载:找到并读取.class文件内容到内存,构建类对象。

- 验证:校验读取内容的合法性。

- 准备:为类对象分配未初始化的内存空间,静态成员赋默认值。

- 解析:初始化常量并加载到内存。

- 初始化:执行类的静态代码块,对静态成员真正初始化 。

2. 触发类加载时机:懒汉模式下,类在第一次被使用时触发加载,如构造实例、调用静态方法、使用静态成员等情况 。

3. 双亲委派模型

- 类加载器:JVM自带Bootstrap ClassLoader(负责标准库查找)、Extension ClassLoader(负责扩展库查找)、Application ClassLoader(负责第三方库和当前项目查找) 。

- 模型过程:类加载时,先由子类加载器将请求委派给父类加载器,父类加载器依次向上查找,直至Bootstrap ClassLoader。若父类加载器未找到类,才由子类加载器尝试加载。如加载java.lang.String类由Bootstrap ClassLoader负责,加载自定义的com.bit.Test类则按层级查找 。该模型确保标准库优先加载,也可被打破,程序员可自定义类加载器 。

 

三、相关对比与补充

 

- 与C/C++内存管理对比:C/C++申请内存需手动释放,易因遗忘释放导致内存泄露。Java等语言引入GC自动管理内存,提高开发效率。C/C++未引入GC是因设计理念注重与C兼容及极致性能,引入GC会增加运行时开销影响性能 。

- GC对执行效率影响:触发GC时可能出现stop the world(STW)问题,即暂停其他工作线程,影响程序执行效率 。

 

四、以下是从图片中提取的部分关键代码示例:

 

// 二叉树构建示例

class Node {

    Node left;

    Node right;

}

Node build() {

    Node a = new Node();

    Node b = new Node();

    Node c = new Node();

    Node d = new Node();

    Node e = new Node();

    Node f = new Node();

    Node g = new Node();

    a.left = b;

    a.right = c;

    b.left = d;

    b.right = e;

    e.left = g;

    c.right = f;

    return a;

}

Node root = build();

// 后续可通过改变引用关系使某些对象不可达,如:

// root.right.right = null; 使f不可达

// root.right = null; 使c和f不可达

 

 

// 类加载时机相关示例

class Test {

    static int n = 10;

    // 当使用Test类的静态成员n,或构造Test实例,或调用Test的静态方法时,会触发类加载

}

 

http://www.lryc.cn/news/2392429.html

相关文章:

  • 自监督软提示调优:跨域NLP新突破
  • Pydantic 学习与使用
  • PCB设计教程【入门篇】——电路分析基础-基本元件(二极管三极管场效应管)
  • 能按需拆分 PDF 为多个文档的工具
  • Apifox 5 月产品更新|数据模型支持查看「引用资源」、调试 AI 接口可实时预览 Markdown、性能优化
  • LiveGBS海康、大华、宇视、华为摄像头GB28181国标语音对讲及语音喊话:摄像头设备与服务HTTPS准备
  • Sqlalchemy 连mssql坑
  • Prompt Engineering 提示工程介绍与使用/调试技巧
  • LLaMaFactory - 支持的模型和模板 常用命令
  • 大模型深度学习之双塔模型
  • MySQL 8主从同步实战指南:从原理到高可用架构落地
  • 瑞数6代jsvmp简单分析(天津电子税x局)
  • 缓存架构方案:Caffeine + Redis 双层缓存架构深度解析
  • AI笔记 - 模型调试 - 调试方式
  • 榕壹云物品回收系统实战案例:基于ThinkPHP+MySQL+UniApp的二手物品回收小程序开发与优化
  • 《软件工程》第 9 章 - 软件详细设计
  • WebVm:无需安装,一款可以在浏览器运行的 Linux 来了
  • 王树森推荐系统公开课 排序06:粗排模型
  • go并发编程| channel入门
  • PH热榜 | 2025-05-29
  • 详解GPU
  • WPF【11_10】WPF实战-重构与美化(配置Material UI框架)
  • (自用)Java学习-5.16(取消收藏,批量操作,修改密码,用户更新,上传头像)
  • 【Node.js】部署与运维
  • 【Java Web】速通JavaScript
  • TDengine 运维——巡检工具(安装前预配置)
  • C#索引器详解:让对象像数组一样被访问
  • 机器学习课设
  • vue 如何对 div 标签 设置assets内本地背景图片
  • wsl2 docker重启后没了