我一直在调试Hazelcast实例中的内存问题。我正在使用Hazelcast来实现我的executor服务。我不需要从executor返回结果,我只是继续通过
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,它与返回对象时使用的内容相同。
发布于 2014-10-20 17:29:20
你不需要在完成后毁掉你的工作。Hazelcast在作业执行时将其从工作队列中移除,而gc负责其余部分。
关于内存已满:你遇到了一个OOME?默认情况下,IExecutorService将继续接受任务,而不会查看有多少内存可用。如果你生产的任务比消耗的任务更快,这可能会导致OOME。
但您可以在ExecutorConfig上设置queueCapacity。一旦达到最大容量,在调用端您将获得一个RejectedExecutionException。你可以用这个来施加一些反压力。
https://stackoverflow.com/questions/26458660
复制相似问题