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의 스크린 샷을 추가했습니다.
는 또한 (모든 JMV 옵션없이) 자바 7을 사용하여 그것을 시도, 나는 PermGen과 같은 문제가 발생합니다.이 아이디어를 피하는 방법을 알려주십시오.
편집 : 이클립스 - 시계 반대 방향으로 leinigen - REPL에서 실행할 때
문제가 발생합니다. 기본 명령 줄 REPL에서 코드를 실행하면 문제가 발생하지 않습니다!
궁금한 점은 두 번째 가비지 컬렉터 호출에서 "[응답하지 않습니다"] 어떻게 알 수 있습니까? 그러면이 코드를 실행하여 오류를 어떻게 만듭니 까? 나는 그것을 재현 할 수 없다. 정확한 명령을 제공 할 수 있습니까? –
@ErwinRooijakkers, VisualVM 그래프 스크린 샷을 추가했습니다. –
감사합니다. 이 프로그램을 설치하고 Java 1.7.0_80의 REPL에서 Cider로 Emacs에서 루프를 돌렸다. 그것은 잘 실행되고 가비지 수집주기가 일관됩니다. http://i.imgur.com/wHYEmII.png를 참조하십시오. –