gpt4 book ai didi

System.gc()后Java弱引用没有被释放

转载 作者:行者123 更新时间:2023-12-02 01:41:48 25 4
gpt4 key购买 nike

我有一个简单的片段:

Integer integer = 2;
WeakReference<Integer> wi = new WeakReference<>(integer);
WeakReference<Integer> sr = new WeakReference<>(new Integer(3));
System.out.println(wi.get());
System.out.println(sr.get());
System.gc();
System.out.println("step 1 wi = " + wi.get());
System.out.println("step 1 sr =: " + sr.get());
integer = null;
System.gc();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("step 1 wi = " + wi.get());
System.out.println("step 1 sr =: " + sr.get());

“System.gc()”调用应该强制回收所有弱引用,对吧,我什至等了 1 秒以确保 gc() 发生。但即使设置了“integer = null”,“wi”也拒绝为空。而 sr 在“System.gc()”之后为空。它打印:

2
3
step 1 wi = 2
step 1 sr =: null
step 1 wi = 2
step 1 sr =: null

我的问题:(1)wi和sr的核心区别是什么?(2)如何让jvm回收wi?

非常感谢。

最佳答案

它与 System.gc() 不做任何保证这一事实没有任何关系(它没有,但这不是你看到你所看到的东西的原因),或者弱引用如何与 gc 交互。

j.l.Integer 类为所有字节值(从 -128 到 +127)保存 Integer 实例的“缓存”。您可以观看实际操作:

System.out.println(Integer.valueOf(127) == Integer.valueOf(127));
System.out.println(Integer.valueOf(128) == Integer.valueOf(128));

以上打印 true false

这段代码:

Integer x = 2;

是语法糖。编译器实际上最终编译的内容是这样的代码:

Integer x = Integer.valueOf(2);

当然,如果你调用new Integer,你总是会得到一个新对象,因为,这就是规范所说的。您也可以测试一下:

System.out.println(new Integer(5) == new Integer(5));

以上打印false

实际上,java.lang.Integer 类本身保存了对 wi 引用所指向事物的引用,因此它永远不会被收集。

重试完全相同的代码,但这次不是“= 2”,而是尝试“= 128”,这次它将收集与 sr 相同的信息。

关于System.gc()后Java弱引用没有被释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54379677/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com