对象复活

http://blog.csdn.net/dc_726/article/details/7934101

附:对象复活

在根搜索中得到的不可达对象并不是立即就被标记成可回收的,而是先进行一次
标记放入F-Queue等待执行对象的finalize()方法,执行后GC将进行二次标记,复活
的对象之后将不会被回收。因此,使对象复活的唯一办法就是重写finalize()方法,
并使对象重新被引用。
[java]  view plain copy
  1. package com.cdai.jvm.gc;  
  2.   
  3. public class DeadToRebirth {  
  4.   
  5.     private static DeadToRebirth hook;   
  6.       
  7.     @Override  
  8.     public void finalize() throws Throwable {  
  9.         super.finalize();  
  10.         DeadToRebirth.hook = this;  
  11.     }  
  12.       
  13.     public static void main(String[] args) throws Exception {  
  14.         DeadToRebirth.hook = new DeadToRebirth();  
  15.         DeadToRebirth.hook = null;  
  16.         System.gc();  
  17.         Thread.sleep(500);  
  18.         if (DeadToRebirth.hook != null)  
  19.             System.out.println("Rebirth!");  
  20.         else  
  21.             System.out.println("Dead!");  
  22.           
  23.         DeadToRebirth.hook = null;  
  24.         System.gc();  
  25.         Thread.sleep(500);  
  26.         if (DeadToRebirth.hook != null)  
  27.             System.out.println("Rebirth!");  
  28.         else  
  29.             System.out.println("Dead!");  
  30.     }  
  31.       
  32. }  

要注意的两点是:
第一,finalize()方法只会被执行一次,所以对象只有一次复活的机会。
第二,执行GC后,要停顿半秒等待优先级很低的finalize()执行完毕。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值