- 引用计数算法
- 原理:对象A被其他对象引用时,引用计数+1,当其他对象被垃圾回收时,对象A的引用计数-1,当对象A的引用计数=0时,对象A可被垃圾回收。
- 优点:实现简单,判定效率高
- 缺点:需要额外的空间去存储计数器,关联更新计数时增加了时间开销,无法解决循环依赖
- 补充:Cpython(C语言开发的Python解释器)使用双向链表解决循环依赖问题,但是需要额外字段去存储标识数据(gc_refs),费空间、费性能
- 可达性算法
- 什么样的对象可作为GCRoot: 如果一个指针,他保存了堆内存里的对象地址,但是自己又不放在堆内存里,那他就是一个Root。
- 虚拟机栈中的引用对象:方法中使用的参数、局部变量等
- 方法去中类静态属性引用的对象
- 方法区中常量引用对象:字符串常量池里的引用
- 所有被同步锁synchronized持有的对象
- java虚拟机内部的引用:基本数据类型对应的class对象,一些异常对象(如空指针,内存溢出),系统类加载器
- 原理:通过判断对象与GCRoot引用链是否可达,当不可达时,此对象可被回收
- 重点:由于finalize()的存在,虚拟机中的对象可能会有3中不同的状态
- 可触及的:从根节点开始,引用链可达
- 可复活的:对象的所有引用都被释放,但是还没有执行过finalize(),此时会将对象放入F-Queued队列,如果执行时与引用链上的对象建立联系,则此对象可复活
- 不可触及的:执行过finalize(),且没有复活,则对象被标记为可回收(finalize只能被执行一次,也就是说当对象被复活后再次不可达时,会直接被标记为可回收)
- 什么样的对象可作为GCRoot: 如果一个指针,他保存了堆内存里的对象地址,但是自己又不放在堆内存里,那他就是一个Root。
JVM学习笔记-垃圾回收之检测垃圾的方法
最新推荐文章于 2024-07-21 23:15:28 发布