2012-08-14 2 views
10

Java 7이 영구 생성 세대를 수집하지 못하는 이유는 누구나 알 수 있습니까? PermGen, Java 5는 영구 생성 및 어플리케이션 실행을 수집하는 반면 java.lang.OutOfMemoryError : PermGen 잘?Java 7이 Java 5에서 수집 한 영구 생성을 수집하지 못했습니다.

응용 프로그램은 루프에서 자이 썬 표현식을 평가하므로 하나의 반복이 약합니다. 5 초. 루프의 몸과 같이 보인다 :의

PythonInterpreter py = new PythonInterpreter(); 
py.set("AI", 1); 
((PyInteger)py.eval(expr)).getValue() 

스크린 샷 jvisual VM 동일한 매개 변수가 사용되는 두 가지 경우 모두 응용 프로그램이 자바 7 자바 5

에서 실행하기위한 촬영 :

-Xmx700m 
-XX:MaxPermSize=100m 
-XX:+HeapDumpOnOutOfMemoryError 
-Xloggc:"C:\Temp\gc.log" -XX:+PrintGCDetails -XX:-TraceClassUnloading -XX:+PrintClassHistogram 

java 7java 5

+1

JConsole 또는 다른 도구에 로그인하여 gc 알고리즘을 확인 했습니까? – kosa

+1

JVM 시작 설정이 다를 수 있습니다. 귀하의 신청서에 이상한 것이 있습니까? 핫로드 코드, 커스텀 클래스 로더 등? – Andy

+0

GC 사용자는 항상 GC 성능을 조정하여 성능을 향상시키기 위해 노력하고 있으므로 이러한 차이가 있는지는 놀랍지 않습니다. 내 __guess__는 이제 100Mb가 아닌 700Mb에 초점을 맞추고 있으며이를 제어하기위한 노력을 기울이기보다는 영구 메모리를 확장하게됩니다. 그들은 PermGen을위한 좋은 숫자보다는 오히려 고성능 및 700Mb 안에 체재에 집중했다. – RalphChapin

답변

0

permgen 누출 가능성 중 하나는 직렬화 가능 interf 각 PyInteger에 의해 구현되는 에이스는 정적 인 class_to_type 맵 (PyType.java:101)에 저장되며, 이것은 자이 썬 bug입니다. 내가 알고있는 5와 7 사이의 permgen 할당에 대한 유일한 재미있는 변화는 7에서 intern'd 문자열 제거와 직접 바이트 버퍼 메모리 할당에 대한 몇 가지 변경 사항이므로 그래프의 일시적인 동작은 unloading으로 설명 될 수 있습니다

2

문제를 재현 할 수있는 작은 예제가 있는데, Eclipse 외부에서 Java 7에서 실행되는 프로그램은 영구 생성시 메모리 누수가 발생하지 않는다는 것을 발견했습니다.

import org.python.core.PySystemState; 
import org.python.util.PythonInterpreter; 

public class Test01 { 

    public static void main(String[] args) throws Exception { 
    PySystemState.initialize(); 
    long startNanos = System.nanoTime(); 
    for(int i = 0; i < 450000; i++) { 
     PythonInterpreter pi = new PythonInterpreter(); 
     long elapsedNanos = System.nanoTime() - startNanos; 
     int avgStepInMicros = (int)((elapsedNanos/1000)/(i+1)); 
     final String code = String.format(
       "stepNo = %d + 1\n" + 
       "if stepNo %% 100 == 0:\n" + 
       " print 'stepNo: %%d, elapsedMillis: %%d, avgStepInMicros: %%d' %% (stepNo, %d, %d)", i, elapsedNanos/1000000, avgStepInMicros); 
     pi.exec(code); 
    } 
    } 
} 

MAT

가비지 컬렉터 루트 디버거 스레드를 보였다.

GCRoot

이상한 이 문제가되지 않는 자바 5의 디버깅 응용 프로그램입니다.

+0

디버거가 이러한 참조를 보유하고 있습니까? 조금도. – MilesHampson

관련 문제