判断java虚拟机内存里的对象已死两种方式


第一种:引用计数饭:给对象添加一个引用计数器,每当有一个地方需要引用它的时候  ,计数器的值就加1,否则就减1,计数器的值为0的时候,就说明对象已死

缺点:如果该对象被外一个引用指着,前一个引用永远不会再被利用了,但是她的计数器不为零,则那个对象永远不会被认为死掉,

实际上,虚拟机还是会回收他们的,所以,虚拟机不是用这种方式回收他们的,

第二种:根搜索算法:通过一系列的名为“gc roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过 的路径称之为引用连(reference chain),当一个对象到gc roots

没有任何引用链相连(用图论的话来说就是从Gc Roots到这个对象不可达)时,证明这个对象是不可用的,辉判断为可回收对象,但不会立即回收,它还有一次机会

如果对象在进行跟搜索后发现没有与GC roots,相连接的引用链,那他将会被第一次标记并且进行一次筛选,判断有没有必要进行回收:筛选的条件是此对象有没有必要执行finalize():如果对象没有覆盖finalize()方法,或者已经被虚拟机调用过,则java虚拟机将这两种情况视为没必要执行;如果被判定执行finalize()方法,就会被放到一个

F-Queue队列之中,并在稍后有虚拟机自动建立一个低优先级的Finalizer线程去执行,这里所谓的“执行”是指虚拟机会触发这个方法,但并不承诺会等待它运行结束。这样做的原因是,如果一个对象在finalize()方法中执行缓慢,或则发生了死循环,将很可能导致F-queue队列中的其它对象永久处于等待状态,甚至导致整个内存回收系统崩溃。finalize()方法是对象逃脱死亡命运的最后一次机会,稍后gc将对F-queue中对象进行二次标记,他们就会死掉,即被回收

finalize()的方法,它的工作原理应该是这样的:一旦垃圾收集器准备好释放对象占用的存储空间,它首先调用finalize(),而且只有在下一次垃圾收集过程中,才会真正回收对象的内存。所以如果使用finalize(),就可以在垃圾收集期间进行一些重要的清除或清扫工作(如关闭流等操作)。但JVM(Java虚拟机)不保证此方法总被调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值