gpt4 book ai didi

当 Java 对象仍然与强引用和弱引用链接时,它会被 gc-ed

转载 作者:行者123 更新时间:2023-12-04 21:01:37 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Can java finalize an object when it is still in scope?

(2 个回答)


1年前关闭。




我这里有一个例子:

import java.lang.ref.WeakReference;

public class WeakRefTest {
public static void main(String[] args) {
Object obj = new Object();
WeakReference<Object> weakRef = new WeakReference<Object>(obj);
int i = 0;
while (true) {
if (weakRef.get() != null) {
i++;
System.out.println("The object is alive for " + i + " loops - " + weakRef);
} else {
System.out.println("The object has been collected.");
break;
}
}
}
}

运行这个程序时,我们会得到 "The object has been collected." 的输出一段时间后,这意味着对象将被 gc-ed。

但是,仍然有一个名为 "obj" 的强引用。链接到对象,如何回收?因为后来JVM发现没有强引用使用,所以不是强可达?

最佳答案

由于您的循环在资源使用方面运行得非常“热”,JVM 将希望对其进行优化。这样做可能会指向编译器这样一个事实,即实际上在进入循环后无法到达强引用,因此将其优化掉。

如果您添加类似 System.out.println(obj) 的内容,此行为可能会改变。在你的循环之后。您可能需要调整循环条件,以便编译器看不到新语句实际上是无法访问的代码...(类似于 while (weakRef.get() != null) )

关于当 Java 对象仍然与强引用和弱引用链接时,它会被 gc-ed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59280215/

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