栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

调用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 remainA 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!");    }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/464289.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号