java - 使用 Hazelcast 的执行器

标签 java executorservice hazelcast

我一直在调试 Hazelcast 实例中的内存问题。我正在使用 Hazelcast 来实现我的执行者服务。我不需要执行者返回结果,我只是继续通过

提交作业
executorService.executeOnMember(Runnable, member);

它运行良好一段时间,之后内存已满。

我使用了线程转储工具,我可以看到这个

        at com.hazelcast.executor.RunnableAdapter.call(RunnableAdapter.java:49)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at com.hazelcast.executor.DistributedExecutorService$CallableProcessor.run(DistributedExecutorService.java:187)
    at com.hazelcast.util.executor.CachedExecutorServiceDelegate$Worker.run(CachedExecutorServiceDelegate.java:186)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)
    at com.hazelcast.util.executor.HazelcastManagedThread.executeRun(HazelcastManagedThread.java:76)
    at com.hazelcast.util.executor.HazelcastManagedThread.run(HazelcastManagedThread.java:92)

让我震惊的第一件事是提交的作业在完成后被销毁,或者我需要为此手动编码。这是因为我们正在使用 FutureTask,它与返回对象时使用的东西相同。

最佳答案

完成后您不需要销毁您的工作。 Hazelcast 会在执行作业时将其从工作队列中删除,然后由 gc 处理剩下的工作。

关于内存已满:您遇到了 OOME?默认情况下,IExecutorService 将继续接受任务,并且不查看有多少内存可用。如果您生成任务的速度快于消耗任务的速度,则可能会导致 OOME。

但是你可以在ExecutorConfig上设置queueCapacity。一旦达到最大容量,在调用方您将收到 RejectedExecutionException。您可以使用它来施加一些背压

关于java - 使用 Hazelcast 的执行器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26458660/

相关文章:

java - 在 openjpa 中通过 JPQL 获取连接以进行多对多映射

java - cucumber 数据表错误 - io.cucumber.datatable.UndefinedDataTableTypeException : Can't convert DataTable to cucumber. api.DataTable

Java 时间戳 : Joda vs Date vs Long

java - 自定义对象中的 Hazelcast 查询

java - 如何在框架中显示带有组件的面板

java - Java 进程的 HealthChecker

java - 将任务移至单独的线程,避免任务运行时重复并正确使用 Executors + Future

java - 为什么当 ExecutorService 上的所有任务完成或取消时,awaitTermination 不能可靠地返回

amazon-web-services - 用于 EC2 自动发现的 AWS 凭证

docker - Hazelcast无法连接到Hazelcast-mancenter