调用System.gc()后,为何对WeakReferenced对象不进行垃圾回收处理?

2026-04-02 00:291阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计395个文字,预计阅读时间需要2分钟。

调用System.gc()后,为何对WeakReferenced对象不进行垃圾回收处理?

调用System.gc()后,不会对WeakReference+测试的前提是有缺陷的。System.gc()只是运行垃圾收集器的提示,并不保证立即执行。它经常被忽视。从文档中可知:调用gc方法,Java虚拟机将花费更多精力来回收未使用的对象。

调用System.gc()后,不会对WeakReference

测试的前提是有缺陷的。System.gc()只是运行垃圾收集器的 提示 。它经常被忽略。

从文档中:

调用gc方法 ,Java虚拟机将花费更多精力来回收未使用的对象,以使它们当前占用的内存可用于快速重用。当控件从方法调用返回时,Java虚拟机将尽最大努力从所有丢弃的对象中回收空间。

(强调我的)

将来,您可能会使用VM选项-verbose:gc并-XX:+PrintGCDetails查看垃圾回收器在做什么。

调用System.gc()后,为何对WeakReferenced对象不进行垃圾回收处理?


更重要的是,您还将 很快 从弱引用中删除引用,并将其放回强引用中:

A a = new A();WeakReference 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 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!"); }}


本文共计395个文字,预计阅读时间需要2分钟。

调用System.gc()后,为何对WeakReferenced对象不进行垃圾回收处理?

调用System.gc()后,不会对WeakReference+测试的前提是有缺陷的。System.gc()只是运行垃圾收集器的提示,并不保证立即执行。它经常被忽视。从文档中可知:调用gc方法,Java虚拟机将花费更多精力来回收未使用的对象。

调用System.gc()后,不会对WeakReference

测试的前提是有缺陷的。System.gc()只是运行垃圾收集器的 提示 。它经常被忽略。

从文档中:

调用gc方法 ,Java虚拟机将花费更多精力来回收未使用的对象,以使它们当前占用的内存可用于快速重用。当控件从方法调用返回时,Java虚拟机将尽最大努力从所有丢弃的对象中回收空间。

(强调我的)

将来,您可能会使用VM选项-verbose:gc并-XX:+PrintGCDetails查看垃圾回收器在做什么。

调用System.gc()后,为何对WeakReferenced对象不进行垃圾回收处理?


更重要的是,您还将 很快 从弱引用中删除引用,并将其放回强引用中:

A a = new A();WeakReference 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 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!"); }}