如何解决调用System.gc后,不会对WeakReferenced对象进行垃圾回收
测试的前提是有缺陷的。System.gc()
只是运行垃圾收集器的 提示 。它经常被忽略。
从文档中:
调用gc方法 ,Java虚拟机将花费更多精力来回收未使用的对象,以使它们当前占用的内存可用于快速重用。当控件从方法调用返回时,Java虚拟机将尽最大努力从所有丢弃的对象中回收空间。
(强调我的)
将来,您可能会使用VM选项-verbose:gc
并-XX:+PrintGCDetails
查看垃圾回收器在做什么。
更重要的是,您还将 很快 从弱引用中删除引用,并将其放回强引用中:
A a = new A();
WeakReference<A> wr = new WeakReference<>(a);
a = null; // no strong references remain
A a1 = wr.get(); // the instance now has a strong reference again
除非在这两个指令之间进行垃圾收集,否则将不会对对象进行垃圾收集。
如果删除a1
,您的代码将按照我运行它时的预期运行(尽管由于我回答的第一部分,您的工作量可能会有所不同):
class A
{
public static void main(String[] args)
{
A a = new A();
WeakReference<A> wr = new WeakReference<>(a);
a = null;
System.out.println(a);
try {
System.gc(); // instance of A is garbage collected
Thread.sleep(10000);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(wr.get());
}
@Override
protected void finalize( )
{
System.out.println(Thread.currentThread().getName() + ": See ya, nerds!");
}
}
解决方法
我是Java的新手。我现在正在学习WeakReference的概念。我遇到一个可能看起来很愚蠢的问题,但我只是想找出原因。问题是:根据Java文档,“弱引用对象,它们不会阻止对其引用进行最终化,最终确定和回收”。
所以我做了这个小测试:
import java.lang.ref.WeakReference;
public class A {
public static void main(String[] args) {
A a = new A();
WeakReference<A> wr = new WeakReference<>(a);
a = null;
A a1 = wr.get();
System.out.println(a);
System.out.println(a1);
try {
System.gc();
Thread.sleep(10000);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(a1);
}
@Override
protected void finalize( ) {
System.out.println(Thread.currentThread().getName() + ": See ya,nerds!");
}
}
但是,我注意到在GC运行之后,wr.get()
仍然可以返回我期望为null的对象,并且该方法finalize()
未被调用。那么出了什么问题?感谢您的提前帮助!:)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。