Java - 可调用内存不足解决方案?

Java - Callable Out of memory solution?

大家好,您能帮我解决我在 Java 程序中遇到的错误吗?我用循环执行 Callable 实现,基本上我需要向另一个 Web 服务发送请求,我将收集响应 ID。根据我的测试,我的目标是使用以下实现异步处理它。有一次我再次尝试 运行 我的程序然后我得到了这种错误“错误 500:java.lang.OutOfMemoryError:创建线程失败:retVal -1073741830,errno 11”。我所做的是我只是重新启动服务器然后就可以了。

所以我想知道我的实现是否有问题?就像我需要添加或删除任何额外的代码行以防止再次遇到此类错误吗?我只经历过一次。希望你能帮助我

        //pccsSurvList is a list of details coming from the database.

        ExecutorService executorService = null;
        List<Callable<SyncFlagEntity>> lst = new ArrayList<Callable<SyncFlagEntity>>();
        
        if(pccsSurvList != null && pccsSurvList.size() > 0){
            executorService = Executors.newFixedThreadPool(pccsSurvList.size());
            for(PCCSSurveyInfoEntity user: pccsSurvList){

                NotifyEmailTransactionImpl emailTransact = new NotifyEmailTransactionImpl(user);
                lst.add(emailTransact);
                
            }
        }
        // returns a list of Futures holding their status and results when all complete
        List<Future<SyncFlagEntity>> tasks = new ArrayList<Future<SyncFlagEntity>>();
        tasks = executorService.invokeAll(lst);

        executorService.shutdown();
        

java.lang.OutOfMemoryError: Failed to create a thread

这个OutOfMemoryError表示Java内存不足。

问题很可能出在这一行...

executorService = Executors.newFixedThreadPool(pccsSurvList.size());

您得到了很多行,但没有足够的 RAM 供 JVM 为每一行创建一个线程。尝试记录您获得的行数,看看发生了什么。

我认为您同时运行 处理了太多进程。你应该尝试设置一个限制并使用线程池。

也许你可以这样做:

ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(pccsSurvList.size());

然后在 for 循环中你可以这样做:

executor.submit(() -> emailTransact);

这里还有更多:https://www.baeldung.com/thread-pool-java-and-guava

另请参阅响应式编程。可以为您提供更多帮助:https://www.vogella.com/tutorials/RxJava/article.html