JVM垃圾回收判断对象存活的算法
JVM垃圾回收判断对象存活的算法
- 引用计算法
定义:在对象中添加一个引用计数器,每当有一个地方应用它时,计数器值就加一;当引用失效时,计数器值减一;任何时刻计数器为零的对象就是不可能再被使用的。
缺点:主流Java虚拟机里面都没有选用引用计数算法来管理内存。主要原因是这种算法有很多例外的情况要考虑,譬如单纯的引用计数就很难解决对象之间循环引用(依赖)的问题。
- 可达分析算法
定义:这个算法的基本思路就是通过一系列称为“GC Roots”的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,搜索过程所走过的路径称为“引用链”(Reference Chain),如果某对象到GC Roots间没有任何引用链相连,或者用图论的话来 说就是从 GC Roots到这个对象不可达时,证明此对象是不可能再被引用的。
Java体系固定作为GC Roots的对象包括以下几种
1、在虚拟机栈(栈帧中的本地变量表)中引用的对象,譬如各个线程被调用的方法堆栈中使用到的参数、局部变量、临时变量等
2、在方法区中类静态属性引用的对象,譬如Java类的引用类型静态变量
3、在方法区常量引用的对象,譬如字符串常量池(String Table)里的引用
4、在本地方法栈中JNI(通常所说的Native方法)引用的对象
5、Java虚拟机内部的引用,如基本数据类型对应的Class对象,一些常驻的异常对象(比如NullPointException、OutOfMemoryError)等,还有系统类加载器
6、所有被同步锁(synchronized关键字)持有的对象
7、反映Java虚拟机内部情况的JMXBean、JVMTI中注册的回调、本地代码缓存等。
除了这些固定的GC Roots集合以外,根据用户所选用的垃圾收集器以及当前回收的内存区域不同,还可以有其他对象“临时性”的加入。譬如分代收集和局部回收(Partial GC),如果只针对Java堆中某一块区域发起垃圾收集时,必须考虑到内存区域是虚拟机自己实现细节,不是孤立封闭的,所以某个区域里的对象完全可能被堆中其他对象引用。
浙公网安备 33010602011771号