快速业务通道

关于JVM的垃圾收集(三) - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-21

关于JVM的垃圾收集(三)

时间:2011-01-08 BlogJava 隔叶黄莺

对象可触及时的生命周期

在 JVM 1.2 之前,堆中的对象分为三种状态,分别是:

1.可触及的 -- 从根节点开始可追踪到

2.可复活的 -- 从根节点开始追踪不到,但有可能被终结方法触及并复活。不仅仅是那些声明了 finalize() 方法的对象,而是所有的对象都要经过可复活状态

3.不可触及的 -- 以上两种可能性都不存在,可以真正回收它们所占据的内存了

版本 1.2 中,可触及按强弱进一步细分为:

1.强可触及 -- 即原来的可触及,从根节点开始的任何直接引用,如一个局部变量或任何从强可触及对象的实例引用的对象

2.软可触及 -- 表现为 SoftReference 所引用的对象

3.弱可触及 -- 表现为 WeakReference 所引用的对象

4.影子可触及 -- 表现为 PhantomReference 所引用的对象

SoftReference、WeakReference、PhantomReference 都是 java.lang.ref.Reference 类的子类。强引用与这三种弱引用之间最基本的差别是,强引用禁止引用目标被垃圾收集,而那三种引用不禁止。

要创建某一对象的软引用、弱引用或是影子引用,只需简单的包装一下。例如,创建一个 cow 对象的软用就写成:

SoftReference softCow = new SoftReference(cow);  //对于 WeakReference 和 PhantomReference 都是一样的

这里 softCow 是一个强引用,从 softCow 到 cow 是一个软引用,也就预示着垃圾收集器从根节点开始只能通过一个软引用才能触及到这个 cow 对象。要切断到 cow 的软引用,使之不再软可触及,可调用 softCow.clear(),要获取 cow 对象用 softCow.get()。

可触及性状态的变化

引入三个这样的引用对于虚拟机是有用处的,垃圾收集器对强引用对象是不能肆意妄为,但是它可随意更改百强可触及对象的可触性状态。在软引用、弱引用或者影子引用指向对象的可触及状态被垃圾收集器改变时,你可以获得这变化发生的通知,方法是要把引用对象和引用队列关联起来。

引用队列是 java.lang.ref.ReferenceQueue 类的实例,垃圾收集器在改变可触及性状态时会把所涉及的引用对象编入到队列中。你只要设置并观察引用队列,便可异步得到通知了。

关于JVM的垃圾收集(三)(2)

时间:2011-01-08 BlogJava 隔叶黄莺

下面用代码来演示一下 Reference、ReferenceQueue 与 Object 之间的关系,以及如何监听到可触及状态的变化。

package com.unmi.ref; import java.lang.ref.ReferenceQueue; import java.lang.ref.SoftReference; /**   * 测试 Reference   * @author Unmi   */ public class TestReference {      public static void main(String[] args) throws InterruptedException {          final ReferenceQueue<Cow> queue = new ReferenceQueue<Cow>();//引用队列          //引用和引用队列进行关联          SoftReference<Cow> ref1 = new SoftReference<Cow>(new Cow(1),queue);          final SoftReference<Cow> ref2 = new SoftReference<Cow>(new Cow(2),queue);          System.out.println(queue.poll());//poll()方法取不到对象即刻返回null          ref1.enqueue(); //把ref1所引用的对象cow1编入到引用队列中          System.out.println(queue.poll().get()); //用poll()取队列上的对象          new Thread(){ //启动一个线程来监测引用队列中的对象              public void run(){                  try {                      //用

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号