我最近在使用可填充的期货时遇到了内存不足的问题,因为发生了太多的垃圾收集,并且想确保我正确使用CompletableFutures。
我想要并行调用3个服务。现在我有以下内容:
final CompletableFuture<Void> f1 = runAsync(() -> m1.call(arg1, arg2, arg3));
final CompletableFuture<Void> f2 = runAsync(() -> m2.call(arg1, arg2, arg3, arg4));
final CompletableFuture<Void> f3 = runAsync(() -> m3.call(arg1, arg2, arg3));
然后我遍历期货并在每个期货上调用.get()。我还看到了以下例子:
final CompletableFuture<Void> completableFuture = CompletableFuture.allOf(
CompletableFuture.runAsync(() -> m1.call(arg1, arg2, arg3)),
CompletableFuture.runAsync(() -> m2.call(arg1, arg2, arg3),
CompletableFuture.runAsync(() -> m3.call(arg1, arg2, arg3))
);
然后调用.join()
解决这个问题的正确方法是什么?
错误我在其中一个可完成的期货上收到.get()行的积分。
java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: GC overhead limit exceeded
at java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:357)
at java.util.concurrent.CompletableFuture.get(CompletableFuture.java:1895)