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堆中某一块区域发起垃圾收集时,必须考虑到内存区域是虚拟机自己实现细节,不是孤立封闭的,所以某个区域里的对象完全可能被堆中其他对象引用。

 

posted @ 2022-05-17 11:59  Java新人开发  阅读(43)  评论(0)    收藏  举报