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

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的静态方法时,会触发类加载

}

 

相关文章:

  • 华为OD机试真题——最长的顺子(2025B卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
  • 洪水危险性评价与风险防控全攻略:从HEC-RAS数值模拟到ArcGIS水文分析,一键式自动化工具实战,助力防洪减灾与应急管理
  • 力扣面试150题--二叉搜索树迭代器
  • 海量数据查询加速:Presto、Trino、Apache Arrow 实战指南
  • 第五十二节:增强现实基础-简单 AR 应用实现
  • Odoo 自动化规则全面深度解析
  • 《仿盒马》app开发技术分享-- 地图选点(端云一体)
  • Python爬虫实战:研究Selenium框架相关技术
  • 大数据下HashMap 扩容优化方案及选择
  • 哈希表day5
  • 【C++】给定数据长度n,采样频率f,频率分辨率是多少?
  • day37打卡
  • 微信小程序进阶第2篇__事件类型_冒泡_非冒泡
  • 精益数据分析(86/126):Parse.ly的转型启示——从用户增长到商业变现的艰难跨越
  • kali切换为中文
  • Golang 的协程调度小结
  • 原子操作(C++)
  • 初等数论--Garner‘s 算法
  • crash常用命令
  • JavaScripts API(应用程序编程接口)
  • 咸阳机场建设招聘信息网站/seo优化网站快速排名
  • 网站建设大纲/搜索引擎营销的英文缩写
  • wordpress的站点地图/爱站网怎么使用
  • wordpress做教育网站/西安官网seo技术
  • 自己的网站服务器/东莞疫情最新数据
  • 福建建设管理中心网站/品牌推广策略有哪几种