关于垃圾回收机制的疑问,各位哥哥姐姐弟弟妹妹帮帮忙阿~

skytip 2004-10-13 02:47:37
当初看gc的时候就有些疑问,后来看了不少讨论的文章,最近看到Reference类所以回顾了一下gc,感觉还是有些乱.....这个疑问是这么产生的:首先请看下面的代码:
MyObject obj = new MyObject();
ReferenceQueue rq = new ReferenceQueue();
WeakReference wr = new WeakReference(obj, rq);
obj = null;
System.gc();
System.out.println("Polling the reference queue returns " +
rq.poll());
System.out.println("Getting the referent from the " +
"weak reference returns " + wr.get());
结果为:
Polling the reference queue returns java.lang.ref.WeakReference@eee36c
Getting the referent from the weak reference returns null
问题的焦点在于:new MyObject()出的对象占用的堆内存在gc()后究竟释放了没有?
以前看到的一篇文章里面说过:“当 WeakReference 或 SoftReference 类的 get() 方法返回null 时,就有一个对象被声明为finalizable,而且可能(不过不一定)被收集。只有当heap对象完全结束而且其内存被回收后,WeakReference 或 SoftReference 才会被放到与其关联的ReferenceQueue上。” 按照此说法,堆对象MyObject肯定已经完全结束而且其内存已经被回收,不然那个弱引用不会放到引用队列里,也就是说调用gc()后gc很有可能(我试过多次都是这个结果)运行并且收了那块堆内存,这就与gc运行的可能性理论产生了冲突。在csdn上看到有人说过“你可以调用垃圾收集器System.gc(),但调用的含义是你要求系统来回收”,系统收到了这个请求,但系统是否真正的去回收,会根据线程繁忙程度来判断。如果线程正闲置,会响应你的请求。此时系统只运行你一个线程(还有其他后台辅助的),当然有空闲时间,于是立刻回收了你的。” 按这种说法调用gc()在cpu空闲时好像实行回收的概率很大....,但用他这种说法解释前面的说法究竟对否??还是说前面提到那篇文章的观点根本就是错误的,希望有个标准的解释。
...全文
57 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧