2014-10-20 40 views
0

我一直在調試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,它與返回對象時使用的是相同的東西。

回答

0

完成後不需要銷燬作業。 Hazelcast在工作隊列執行時將作業從工作隊列中移除,gc負責處理其餘部分。

關於內存已滿:您正在遇到OOME?默認情況下,IExecutorService將繼續接受任務,而不會查看有多少內存可用。如果你生成的任務比他們消耗的更快,這可能會導致OOME。

但是你可以在ExecutorConfig上設置queueCapacity。一旦達到最大容量,在調用端你將得到RejectedExecutionException。你可以用它來施加一些背壓