执行者使用Hazelcast

时间:2014-10-20 04:38:07

标签: 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,它与返回对象时使用的内容相同。

1 个答案:

答案 0 :(得分:1)

完成后你不需要销毁你的工作。 Hazelcast在执行时将工作从工作队列中删除,gc负责其余工作。

关于内存已满:您正在遇到OOME?默认情况下,IExecutorService将继续接受任务,并且不会查看可用的内存量。如果您生成的任务比消耗的更快,那么这可能会导致OOME。

但您可以在ExecutorConfig上设置queueCapacity。一旦达到最大容量,在调用端就会得到RejectedExecutionException。您可以使用它来应用一些背压