2016-09-16 13 views
3

eval을 사용하는 유전 프로그래밍 알고리즘을 실행할 때이 문제가 발생합니다. 나는이 코드를 실행하면Clojure eval가 가비지 수집기를 중지시킵니다.

(loop [] 
    (do 
    (eval (list '+ (rand) (rand))) 
    (recur))) 

는 가비지 컬렉터가 metaspace에서하지만 두 번째 가비지 컬렉터에 한 번 생성 된 모든 $ eval_n 클래스를 언로드 :

문제를 설명하기 위해, 나는 다음의 코드로 좁혀 호출이 정지합니다.

은 내가 follwing을 JVM 옵션 jdk1.8.0_102 사용 -XX : MetaspaceSize = 200m -XX : MaxMetaspaceSize = 200m

나는 다음과 같은 오류 얻을 잠시 후 :

CompilerException java.lang.OutOfMemoryError: Metaspace, compiling:(form-init2581690491924993906.clj:1:1) 

에게 편집 : JVM이 멈추었을 때 그래프가 더 이상 업데이트되지 않고 전체 CPU 코어를 계속 사용하면서 동작을 표시하는 visualVM의 스크린 샷을 추가했습니다.

enter image description here

는 또한 (모든 JMV 옵션없이) 자바 7을 사용하여 그것을 시도, 나는 PermGen과 같은 문제가 발생합니다.

이 아이디어를 피하는 방법을 알려주십시오.

편집 : 이클립스 - 시계 반대 방향으로 leinigen - REPL에서 실행할 때

문제가 발생합니다. 기본 명령 줄 REPL에서 코드를 실행하면 문제가 발생하지 않습니다!

+0

궁금한 점은 두 번째 가비지 컬렉터 호출에서 "[응답하지 않습니다"] 어떻게 알 수 있습니까? 그러면이 코드를 실행하여 오류를 어떻게 만듭니 까? 나는 그것을 재현 할 수 없다. 정확한 명령을 제공 할 수 있습니까? –

+0

@ErwinRooijakkers, VisualVM 그래프 스크린 샷을 추가했습니다. –

+0

감사합니다. 이 프로그램을 설치하고 Java 1.7.0_80의 REPL에서 Cider로 Emacs에서 루프를 돌렸다. 그것은 잘 실행되고 가비지 수집주기가 일관됩니다. http://i.imgur.com/wHYEmII.png를 참조하십시오. –

답변

0

위의 예에서 꾸준히 메모리 사용량이 증가하는 것으로 나타났습니다. 시스템 추가/gc

(loop [] (do (eval (list '+ (rand) (rand))) (System/gc)) (recur)) 

CPU 사용량은 두 배가되지만 장기간 정상 상태로 보인 메모리 사용량을 유지합니다.

+0

네,하지만 시스템/gc를 자주 호출하면 프로그램이 정말 느려지므로이 방법이 진짜 해결책이라고 생각하지 않습니다. VM은 gc 자체를 처리해야합니다. –

0

결론적으로이 문제는 clojure eval 또는 JVM과 직접 관련이 없습니다. 그것은 일식 - 반 시계 방향 및/또는 외양 - REPL과 함께 만 발생합니다.