JVM--14 【垃圾回收机制】 如何判断对象是垃圾对象

本文探讨了JVM中判断对象是否存活的两种算法之一——引用计数算法。虽然该算法实现简单,能高效判断,但在处理对象间的循环引用问题时失效,可能导致内存泄漏。通过示例代码展示了循环引用导致的对象无法被引用计数算法正确回收的情况,进一步证实HotSpot VM未使用此算法。
摘要由CSDN通过智能技术生成

一、对象已经死了吗?

          在堆里面存放着Java世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是确定这些对象之中哪些是“存活”着,哪些已经“死去”(即不可能再被任何途径使用的对象)

判断对象是否存活的算法:引用计数法、可达性分析算法。这里分两篇博文介绍一下这两种算法,本篇先介绍一下:引用计数算法

二、引用计数算法    

            引用计数算法:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就+1;当引用失效时,计数器值就-1;任何时刻计数器为0的对象就是不能再被使用的垃圾对象。

            引用计数算法的实现简单,判定效率高。在大部分情况下它都是一个不错的算法。但是,至少主流的Java虚拟机里面没有选用引用计数算法来管理内存,主要原因是它很难解决对象之间的相互循环引用的问题,这种情况下,即使断开了对象在虚拟机栈中的reference,引用计数器永远都不会为0,这样就会造成内存泄漏。下面举例说明:

            下面代码中对象g1和g2都有字段instance,赋值使g1.instance = g2  g2.instance = g1 除此之外,这两个对象再无任何引用,实际上这两个对象已经不可能再被访问,但是它们之间相互引用着对方,导致它们的引用计数都不为0,于是引用计数算法无法通知GC收集器回收它们。


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值