Czy ktoś wie, dlaczego java 7 nie może pobrać stałego generowania aplikacji, powodując java.lang.OutOfMemoryError: PermGen, podczas gdy java 5 zbiera ciągłe generowanie i uruchamianie aplikacji dobrze?Java 7 nie zbiera stałego generowania, które jest gromadzone przez java 5
Aplikacja wykonuje ocenę wyrażeń jython w pętli, jedna iteracja jest ok. 5 sekund. ciało pętli wygląda następująco:
PythonInterpreter py = new PythonInterpreter();
py.set("AI", 1);
((PyInteger)py.eval(expr)).getValue()
Zrzuty ekranu z jvisual VM prawdopodobnie przeznaczony aplikacja działa w Java 7 i Java 5.
W obu przypadkach stosowane są te same parametry:
-Xmx700m
-XX:MaxPermSize=100m
-XX:+HeapDumpOnOutOfMemoryError
-Xloggc:"C:\Temp\gc.log" -XX:+PrintGCDetails -XX:-TraceClassUnloading -XX:+PrintClassHistogram
Czy sprawdziłeś algorytmy gc logując się w JConsole lub innym narzędziu? – kosa
Mogą istnieć różne ustawienia uruchamiania maszyny JVM. Czy w twojej aplikacji jest coś niezwykłego? jak gorący kod, niestandardowe ładowarki itp.? – Andy
Ludzie z GC zawsze szykują GC, próbując desperacko poprawić wydajność, więc nie jestem zaskoczony, że istnieje taka różnica. Moim zdaniem jest to, że koncentrują się teraz na 700 Mb, a nie na 100 Mb, i pozwalają stałej pamięci rozszerzać, a nie wydatkować wysiłek, aby ją kontrolować. Skupiają się na wysokiej wydajności i utrzymują się w granicach 700 Mb zamiast dobrych liczb dla PermGen. – RalphChapin