精华帖 (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的代码中,是否也可能会产生一直阻塞的现象? |
|
返回顶楼 | |
发表时间: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中的对象被回收,所以回一直阻塞。 |
|
返回顶楼 | |
发表时间:2010-05-31
你好,谢谢你的回答,明白了,不过,我还想在请教一个问题。
使用Reference类实际是想让一个实例对象(Object)进行资源内存回收,但是,自己本身也创建了 WeakReference实例对象(比如new WeakReference(...)),这个WeakReference实例对象同样占用内存, 有此可推出,通过一个新建WeakReference象(内存创建)来回收一个实例对象(Object内存回收),这符合常理吗?还望赐教。 |
|
返回顶楼 | |
发表时间:2010-05-31
logic 写道 你好,谢谢你的回答,明白了,不过,我还想在请教一个问题。
使用Reference类实际是想让一个实例对象(Object)进行资源内存回收,但是,自己本身也创建了 WeakReference实例对象(比如new WeakReference(...)),这个WeakReference实例对象同样占用内存, 有此可推出,通过一个新建WeakReference象(内存创建)来回收一个实例对象(Object内存回收),这符合常理吗?还望赐教。 JVM对Reference是特殊处理的。 |
|
返回顶楼 | |
发表时间:2010-05-31
Agrael 写道 logic 写道 你好,谢谢你的回答,明白了,不过,我还想在请教一个问题。
使用Reference类实际是想让一个实例对象(Object)进行资源内存回收,但是,自己本身也创建了 WeakReference实例对象(比如new WeakReference(...)),这个WeakReference实例对象同样占用内存, 有此可推出,通过一个新建WeakReference象(内存创建)来回收一个实例对象(Object内存回收),这符合常理吗?还望赐教。 JVM对Reference是特殊处理的。 能否再具体点?谢谢 |
|
返回顶楼 | |
发表时间: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;才可以被回收。 当然这个只是一方面。 |
|
返回顶楼 | |