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 @   Java新人开发  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示