java对象的回收,GCRoots不可达

1:引用计数算法

    引用计数算法,意思是每一个对象实例头上面多出来一块内存空间,放一个引用计数器(默认值为0),当该实例被引用一次,计数器加一,当引用结束,引用失效,计数器减一。方法简单粗暴,效率也高。但是对于方法循环引用,内嵌引用等复杂的对象关系,使用引用计数算法就不能很好的解决。所以说hotspot虚拟机在判断一个对象的存活状况是没有使用引用计数算法来管理内存。

    有些面试官会面带微笑的问你,可以讲下jvm里面使用引用计数器算法来标记对象是否存活的好处吗?


2:可达性分析算法

    java,c#的内存管理子系统都是通过可达性分析算法来判断对象的存活状态的。可达性分析算法大概意思是每个对象的生存期间都是从根节点(GC Roots)可触达的,都有一条健康的"引用链"。在内存里面,如果从根节点出发,对于不可触达的对象,都会进行一次标记,来表达该对象是不可能在使用了(不代表未来垃圾回收,就要进行转移或者回收)。

  该图引自《深入理解Java虚拟机》,上图可以看到object5,object6,object7都被标记成可回收的对象。这就是可达性分析算法的简单逻辑。

    

在虚拟机内,什么是GC Roots?

  • 在虚拟机栈(栈帧中的本地变量表)中引用的对象,譬如各个线程被调用的方法堆栈中使用到的 参数、局部变量、临时变量等。

  • 在方法区中类静态属性引用的对象

  • 在方法区中常量引用的对象,如字符串的常量池引用。

  • 在本地方法栈中JNI(即通常所说的Native方法)引用的对象。

  • 所有被同步锁(synchronized关键字)持有的对象

  • 反映Java虚拟机内部情况的JMXBean、JVMTI中注册的回调、本地代码缓存等。

 除了这些固定的GC Roots集合以外,当选择不同的垃圾收集器,还会有对应的其他对象来做 GC Roots。

 

    对象的引用状态,除了被引用,未被引用外。Java又对被引用状态做了细分扩展,分别是强引用(Strongly Re-ference)、软 引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)4种。在一般业务开发中,我们默认创建的对象实例都是强引用类型的,这里不做详细介绍了。

 

   了解对象的标记逻辑,对后面学习垃圾回收动作很重要,后面也会专门介绍各种垃圾回收器的区别。对象标记为不可用状态,至少经历两次标记为不可用才会真正宣告死亡。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值