JVM垃圾收集算法

本文介绍了JVM中判断对象是否存活的方法,如引用计数法、可达性分析算法,还阐述了对象的4种引用类型及方法区的回收。同时详细讲解了垃圾收集算法,包括标记 - 清除、复制、标记 - 整理和分代收集算法,分析了各算法优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、判断对象是否存活

1.1、引用计数法:给对象添加一个引用计数器,每当对象有引用计数器就加一,引用失效计数器就减一。任何时刻计数器为0的对象就是不能再被使用的对象,即要回收的对象。引用计数法的缺点是不能解决对象之间相互循环引用的问题。

1.2、可达性分析算法。通过一系列称为"GC Roots"的对象作为起始点,从这些节点开始向下搜索,搜索走过的路径成为引用链,当一个对象到GC Roots没有任何引用链相连时(即从GC Roots到这个对象不可达),则证明此对象是不可用的。

1.2.1、可作为GC Roots的对象包括:虚拟机栈的栈帧中的本地变量表中引用的对象,方法区中类静态属性引用的对象,方法区中常量引用的对象,本地方法栈中JNI引用的对象。

1.3、对象的引用分为4种强引用–只要强引用还存在,GC永远不会回收被引用的对象。
软引用–在系统将要溢出时将这些对象进行垃圾回收,如果这次的回收还是没有足够的内存,会抛出内存溢出异常。弱引用–此类对象只能存活到下次垃圾收集之前。虚引用–能在这个对象被垃圾回收时收到一个系统通知。

1.4、回收方法区。方法区主要回收两部分内容–废弃常量和无用类。废弃常量的回收和Java堆中对象的回收类似。

1.4.1、判定一个类是无用类需要满足:第一,该类的所有实例已经被回收,第二,加载该类的classLoader已经被回收,第三,该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。

2、垃圾收集算法

2.1、标记-清除算法。该算法分为“标记”和“清除”两部分。首先需要标记出需要清楚的对象,然后在标记完成后统一回收所有被标记的对象。缺点是标记和清除两部分的执行效率比较低,二是在清除之后会产生大量不连续的碎片空间,空间利用率不高。
在这里插入图片描述
2.2、复制算法。将内存分为两部分,每次只使用其中的一部分,等被使用的一部分用完时,将该部分的存活对象按照复制到另外一部分,在另外一部分对象按顺序存储,利用移动堆栈顶针方法,按顺序分配内存,然后再将之前的那一部分全部清理掉。缺点是只能利用内存空间的一部分。该算法多用于新生代中。
在这里插入图片描述
2.3、标记-整理算法。类似于标记-清除算法,个人认为此算法的标记阶段是标记存活对象,然后将存活对象依据堆栈顶针按顺序从内存开始依次排列存放(让所有的存活对象都向一端移动),然后清除掉存活对象底端以外的所有区域。
在这里插入图片描述
2.4、分代收集算法。根据对象存活周期的不同将内存分为几块。在新生代由于有大量的对象会死去,只有少量存活,则选用复制算法。老年代对象存活率高,没有额外空间对其进行分配担保,必须使用标记-清除算法和标记-整理算法。

读《深入理解Java虚拟机-JVM高级特性与最佳实践》所做的笔记。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值