JVM 垃圾回收原理
作业:
请简述 JVM 垃圾回收原理。
JVM 垃圾回收算法
Java 堆中存放着几乎所有的对象实例,回收之前要确定其是否存活着,有两种思路可以判断对象存活
引用计数算法
如果有其他对象对其引用,则计数器加一,引用失效的时候,计数器减一。计数器为 0 时则可以被回收。
弊端:无法解决对象互相引用的问题,他们是内存中的孤岛,但却无法被回收 例如: A.a = B;B.b = A
可达性分析算法
通过一系列称为GC Roots
的对象作为起始点,然后向下搜索,走过的路径为引用链,如果一个对象到 GC Roots 没有任何引用链,则说明此对象是不可达(不可用)的。
固定的 GC Roots 对象
l 在虚拟机栈(局部变量表)中引用的对象(局部变量、临时变量)
l 在方法区类静态属性引用的对象(Java 类的引用类型静态变量)
l 在方法区常量引用的对象(字符串常量池里的引用)
l 在本地方法栈中 JNI 引用的对象
l JVM 内部的引用,如(基本数据类型对应的 Class 对象、一些常驻的异常对象以及系统类加载器)
l 所有被同步锁(synchronized 关键字)持有的对象
JVM 分代收集理论假说
弱分代假说:绝大多数对象都是朝生夕死的
强分代假说:熬过越多次垃圾收集过程的对象就越难以消亡
跨代引用假说:跨代引用相对于同代引用来说仅占极少数
评论