gpt4 book ai didi

Java G1 垃圾收集器生成 Java 不一致?

转载 作者:搜寻专家 更新时间:2023-11-01 03:51:48 25 4
gpt4 key购买 nike

我最近尝试激活垃圾优先垃圾收集器并对其进行评估。一开始我写了这段代码,试图产生一个 java.lang.OutOfMemoryError:

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class G1Test {
public static void floodMemory() {
int i = 0;
try {
// allocate an array where we will just store a lot of java objects
List<Date> l = new ArrayList<Date>();
for (; i < 1051366050; i++) {
l.add(new Date());
}
} catch (Throwable t) {
System.err.println("Throwable in floodMemory!");
System.out.println("i=" + i);
t.printStackTrace();
}
}

public static void main(String[] args) {
try {
System.out.println("Started memory flooding.");
floodMemory();
System.out.println("Sleeping.");
Thread.sleep(Long.MAX_VALUE);
} catch (Throwable t) {
System.err.println("Throwable in main!");
t.printStackTrace();
}
}
}

...我使用两种场景运行代码:

情况 1。使用这些标志:-Xmx4096M -XX:+UseG1GC,我得到以下输出:

    Started memory flooding.    Throwable in main!    java.lang.OutOfMemoryError: Java heap space    at com.siemens.scr.usi.experimental.G1Test.floodMemory(G1Test.java:14)    at com.siemens.scr.usi.experimental.G1Test.main(G1Test.java:26)

... which means that an the infamous OutOfMemoryError is thrown somewhere BUT captured in the main method.

Case 2. With this flag: -Xmx4096M, I get this output:

Started memory flooding.
Throwable in floodMemory!
i=105136605
java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2245)
at java.util.Arrays.copyOf(Arrays.java:2219)
at java.util.ArrayList.grow(ArrayList.java:242)
at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:216)
at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:208)
at java.util.ArrayList.add(ArrayList.java:440)
at com.siemens.scr.usi.experimental.G1Test.floodMemory(G1Test.java:14)
at com.siemens.scr.usi.experimental.G1Test.main(G1Test.java:26)
Sleeping.

...这意味着异常在我期望被捕获的地方被捕获。

注意事项:

  1. 该代码是纯粹的实验性代码,不遵循任何特定目的 - 只是为了观察行为。
  2. 代码在 Dell Precision M4700 上运行的 Windows 7 Enterprise 上使用 Oracle JDK 1.7.0 更新 60、64 位运行。

问题是是否有人可以解释这种行为 - 找不到任何类似的帖子或任何错误报告(我的问题是缺乏一致性)。

最佳答案

这只是一个理论,但它可能与垃圾收集设置没有任何关系,至少不是直接关系:

在第一种情况下 (-Xmx4096M -XX:+UseG1GC):OutOfMemoryError 可能已经按照预期在方法 floodMemory 中抛出,但由于您已准备好处于 OutOfMemory 状态,因此可能还有另一个OutOfMemoryError 在 floodMemory 方法的 catch block 中被抛出。第二个可能是在 System.err 命令中抛出的,这就是为什么您看不到第一个的输出的原因。然后,此错误会传播到 main 方法。

在第二种情况下,垃圾收集器可能已经能够释放足够的内存来执行 System.err 并完成应用程序的其余部分。

同样,这只是一个理论。我尝试用 Java 1.7 运行第一个案例,最终我的程序挂了,我没有看到抛出的异常。

关于Java G1 垃圾收集器生成 Java 不一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24770061/

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