2014-10-20 3 views
0

Hazelcast 인스턴스에서 메모리 문제를 디버깅했습니다. 내 집행자 서비스를 구현하기 위해 Hazelcast를 사용하고 있습니다. 나는 다시 집행의 결과를 필요 없어요 난 그냥 그것은 시간에 좋은 실행Hazelcast를 사용하는 Executor

executorService.executeOnMember(Runnable, member); 

를 통해 메모리가 꽉 찼다 후 작업을 제출에 계속.

I 도구 쓰레드 덤프와 나는 제출 된 작업 완료 후 파괴 된 나에게 공격이

 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을 얻습니다. 이것을 사용하여 일부 배압을 적용 할 수 있습니다.

관련 문제