gpt4 book ai didi

java - 一个 `finalize` 调用如何破坏 GC/JVM?

转载 作者:搜寻专家 更新时间:2023-10-30 21:09:52 25 4
gpt4 key购买 nike

调查时Why ThreadPoolExecutor behaves differently when running Java program in Eclipse and from command line?我写了一个测试,抛出了一个非常奇怪的 OutOfMemoryError (max mem = 256 Mb)

class A {
byte[] buf = new byte[150_000_000];

protected void finalize() {
int i = 1;
}
}

A a1 = new A();
a1 = null;
A a2 = new A();

注释掉 int i = 1 并且测试有效。据我了解,当 finalize 为空时,HotSpot 会忽略它。但是一个几乎空的 finalize 调用怎么会破坏 GC/JVM?

最佳答案

But how can just one empty finalize invocation break GC / JVM?

当有终结器时,对象会比其他情况多存活一轮垃圾收集(因为对象本身必须保持 Activity 状态,直到它被终结)。因此,如果您有一个带有终结器的大对象,那么在没有终结器就不会发生的情况下,自然会导致 OutOfMemoryError 发生。

在这段代码中:

A a1 = new A();
a1 = null;
A a2 = new A();

... GC 将在最后一行触发,以尝试找到足够的内存来分配第二个 A。不幸的是,它不能对第一个 A(以及它引用的数组)进行垃圾回收,因为终结器还没有运行。它不会等到终结器完成,然后再次尝试垃圾收集 - 它只会抛出 OutOfMemoryError

关于java - 一个 `finalize` 调用如何破坏 GC/JVM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14030599/

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