您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

调用System.gc()后,不会对WeakReferenced对象进行垃圾回收。

调用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!");
    }
}
其他 2022/1/1 18:25:15 有485人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶