gpt4 book ai didi

java - 为什么这个 OutOfMemoryError 在被 Future 抛出时没有出现?

转载 作者:行者123 更新时间:2023-12-04 05:02:14 25 4
gpt4 key购买 nike

一个简单的场景:

private static final ExecutorService executor =
Executors.newCachedThreadPool();

public static void main(String... args) throws InterruptedException, ExecutionException {
Future<byte[]> f = null;
for (int i = 0; i < 10; i++) {
f = executor.submit(new Callable<byte[]>(){
@Override
public byte[] call() {
System.out.println("Starting task.");
try {
return new byte[1500 * 1024 * 1024]; // 1500 mb
}
finally {
System.out.println("Task complete.");
}
}
});
}
// System.out.println(f.get().length);
}

当我运行上面的代码时,它(据称)运行没有错误。

(奇怪的是,当我在 NetBeans 中分析此代码时会抛出 OutOfMemoryError,但在我正常运行时不会。)

全部 10 个“任务完成”。消息立即显示,时间范围太短,字节数组无法实际分配。

当我取消注释最后一行时,抛出 ExecutionException。

我知道代码示例有点荒谬......
但是为什么根本没有抛出异常,我怎样才能让 OutOfMemoryError 出现?我必须捕获它吗?那会是一个安全的操作吗?

最佳答案

你不应该 catch Errors - 它们的目的是使您的程序大声崩溃。你应该只接一个 Exception如果你正在记录它/重新抛出它或b。你正在处理它;您无法处理 OutOfMemoryError ,所以让它像它应该的那样让你的程序崩溃。

Future 出现“任务完成”时对象已被分配,而不是在它们完成工作时 - 您需要调用 f.get()在每个 Future 上,以确保它已完成分配其字节数组。当您分析它时,程序运行速度较慢,这允许更多 Futures在 Main 方法终止之前分配它们的字节数组,这反过来又允许它们用完您的所有堆空间。

更改 f到 future 的 ArrayList(以及 f = executor.submitf.add(executor.submit)),然后遍历它并调用 .get()关于它的所有 future 。这应该会在不使用探查器的情况下触发您的 OutOfMemoryError。

关于java - 为什么这个 OutOfMemoryError 在被 Future 抛出时没有出现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16007345/

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