深入理解Java虚拟机笔记---引用类型和对象是否死亡

来源:互联网 发布:树洞软件 编辑:程序博客网 时间:2024/06/03 23:41

本文转自:http://blog.csdn.net/xtayfjpk/article/details/41910377


   在JDK1.2之后,Java对引用的概念进行了扩充,将引用分为强引用(Strong Reference),软引用(Soft Reference),弱引用(Weak Reference),虚引用(Phantom Reference)四种,这四种引用强度依赖逐渐减弱。

1.强引用(Strong Reference就是指在程序代码之中普遍存在的,类似“Object obj = new Object()”这类引用,只要强引用存在,垃圾收集器永远不会回收掉被引用的对象---JVM宁愿报出内存溢出异常,也不会靠回收强引用对象来缓解内存紧张
2.软引用(SoftReference用来描述一些还有用,但并非必须的对象。对于软引用关联着的对象,在系统将要发生内存溢出之前,将会把这些对象列进回收范围之中,并进行第二次回收。如果这次回收还是没有足够的内存,才会抛出内存溢出错误----内存不足时回收
3.弱引用(WeakReference)也是用来描述非必须对象的,但是它的强度比软引用更弱一点,被弱引用关联的对象只能生存到下一次垃圾回收之前-----当垃圾收集器扫描它所管辖的内存区域时,无论当前内存是否足够,都会回收掉被弱引用关联的对象。
4.虚引用(PhantomReference它是最弱的一种引用关系。一个对象是否有虚引用存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象的实例。为一个对象设置虚引用关联的唯一目的是希望能在这个对象被收集器回收时收到一个系统通知。----任何时候都有可能被回收掉。

   在根搜索算法中不可达的对象,也并非是“非死不可的”,这时候它们暂时处于“缓刑”阶段,要真正宣告一个对象死亡,至少要经历两次标记过程:如果对象在进行根搜索后发现没有与GC Roots相连接的引用链,那它将会被第一次标记并进行一次筛选,筛选的条件是此对象是否有必要执行finalize()方法。当对象没有覆盖finallize()方法或该对象的finalize()已经被调用过,虚拟机将这两种情况都视为“没有必要执行”。
   如果一个对象被判断为有必要执行finalize()方法,那么这个对象将会被放置在一个名为F-Queue的队列之中,并在稍后由一条虚拟机自动建立的,低优先级的Finalizer线程去执行。这里所谓的“执行”是指虚拟机会触发这个方法,但并不承诺会等待它运行结束。这样做的原因是,如果一个对象在fianlize()方法中执行缓慢,或者发生了死循环,将很可能会导致F-Queue队列中的其它对象永久处于等待状态,甚至导致整个内存回收系统崩溃。finalize()方法是对象逃脱死亡命运的最后一次机会,稍后GC将对F-Queue中的对象进行第二次小规模的标记,如果对象在finalize()中成功拯救自己--只要重新与引用链上的任何一个对象建立关联既可,那在第二次标记时它将被移出“即将回收”集合;如果对象这时候还没有逃脱,那它就将被回收了。
0 0
原创粉丝点击