论坛首页 Java企业应用论坛

封装ConcurrentHashMap成为具有各种引用类型key与value的ConcurrentReferenceMap,完美取代WeakHashMap

浏览 9812 次
精华帖 (6) :: 良好帖 (7) :: 新手帖 (0) :: 隐藏帖 (7)
作者 正文
   发表时间:2010-05-26   最后修改:2010-05-26
请教一个问题,如果PhantomReference引用的时候,gc回收执行后,再执行remove()方法,结果一直阻塞到那里,好像没有对象引用返回,这是什么回事?

代码如下:
//Create an object    
MyObject obj = new MyObject();
System.out.println("object is " + obj);
//Create a reference queue
ReferenceQueue rq = new ReferenceQueue();
//Create a weakReference to obj and associate our reference queue
PhantomReference wr = new PhantomReference(obj, rq);
obj = null;
System.out.println("The weak reference is " + wr);
System.gc();
Thread.sleep(10000);
System.out.println("Polling the reference queue returns " + rq.remove());
System.out.println("Getting the referent from the " + "phantom reference returns " + wr.get());


由以上现象推测LZ的代码中,是否也可能会产生一直阻塞的现象?
0 请登录后投票
   发表时间:2010-05-29  
logic 写道
请教一个问题,如果PhantomReference引用的时候,gc回收执行后,再执行remove()方法,结果一直阻塞到那里,好像没有对象引用返回,这是什么回事?

代码如下:
//Create an object    
MyObject obj = new MyObject();
System.out.println("object is " + obj);
//Create a reference queue
ReferenceQueue rq = new ReferenceQueue();
//Create a weakReference to obj and associate our reference queue
PhantomReference wr = new PhantomReference(obj, rq);
obj = null;
System.out.println("The weak reference is " + wr);
System.gc();
Thread.sleep(10000);
System.out.println("Polling the reference queue returns " + rq.remove());
System.out.println("Getting the referent from the " + "phantom reference returns " + wr.get());


由以上现象推测LZ的代码中,是否也可能会产生一直阻塞的现象?

remove方法会从调用时阻塞到有Reference中的对象被回收。
你的代码中是已经回收后再remove,之后并没有Reference中的对象被回收,所以回一直阻塞。
0 请登录后投票
   发表时间:2010-05-31  
你好,谢谢你的回答,明白了,不过,我还想在请教一个问题。
使用Reference类实际是想让一个实例对象(Object)进行资源内存回收,但是,自己本身也创建了
WeakReference实例对象(比如new WeakReference(...)),这个WeakReference实例对象同样占用内存,
有此可推出,通过一个新建WeakReference象(内存创建)来回收一个实例对象(Object内存回收),这符合常理吗?还望赐教。
0 请登录后投票
   发表时间:2010-05-31  
logic 写道
你好,谢谢你的回答,明白了,不过,我还想在请教一个问题。
使用Reference类实际是想让一个实例对象(Object)进行资源内存回收,但是,自己本身也创建了
WeakReference实例对象(比如new WeakReference(...)),这个WeakReference实例对象同样占用内存,
有此可推出,通过一个新建WeakReference象(内存创建)来回收一个实例对象(Object内存回收),这符合常理吗?还望赐教。

JVM对Reference是特殊处理的。
0 请登录后投票
   发表时间:2010-05-31  
Agrael 写道
logic 写道
你好,谢谢你的回答,明白了,不过,我还想在请教一个问题。
使用Reference类实际是想让一个实例对象(Object)进行资源内存回收,但是,自己本身也创建了
WeakReference实例对象(比如new WeakReference(...)),这个WeakReference实例对象同样占用内存,
有此可推出,通过一个新建WeakReference象(内存创建)来回收一个实例对象(Object内存回收),这符合常理吗?还望赐教。

JVM对Reference是特殊处理的。

能否再具体点?谢谢
0 请登录后投票
   发表时间:2010-05-31  
logic 写道
Agrael 写道
logic 写道
你好,谢谢你的回答,明白了,不过,我还想在请教一个问题。
使用Reference类实际是想让一个实例对象(Object)进行资源内存回收,但是,自己本身也创建了
WeakReference实例对象(比如new WeakReference(...)),这个WeakReference实例对象同样占用内存,
有此可推出,通过一个新建WeakReference象(内存创建)来回收一个实例对象(Object内存回收),这符合常理吗?还望赐教。

JVM对Reference是特殊处理的。

能否再具体点?谢谢

这个还不是太好举,这样吧,你看看Reference这个类中有一行。

private T referent;		/* Treated specially by GC */


这个本来是强引用属于,但是旁边的注释说明,虚拟机会特殊对待这个引用。所以在Reference这个实例的引用还在的时候,里面的这个private T referent;才可以被回收。
当然这个只是一方面。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics