java.lang.OutOfMemoryError: PermGen space
Ich habe festgestellt, dass viele Leute das Problem auf Folgendes zurückführen: Spring, Hibernate, Tomcat, weil sie Klassen dynamisch generieren, was zu einem Überlauf des permanenten Heaps in der JVM führt. Dann gibt es verschiedene Lösungen. Einige Leute empfehlen, die Tomcat-Version auf die neueste Version zu aktualisieren oder Tomcat überhaupt nicht zu verwenden. Einige Leute bezweifeln auch das Problem von Spring, und die Diskussion im Spring-Forum ist sehr intensiv, da Spring CBLIB in AOP verwendet, um viele Klassen dynamisch zu generieren.
Aber die Frage ist, warum diese großartigen Open-Source-Projekte das gleiche Problem haben. Ist es ein grundlegenderer Grund? Tomcat hat diesen Punkt in den Fragen und Antworten sehr implizit beantwortet. Wir sind uns dieses Problems bewusst, aber diese Frage ergibt sich aus einer grundlegenderen Frage.
Also hat jemand die grundlegendere JVM überprüft und den Schlüssel zum Problem gefunden. Es stellt sich heraus, dass die JVM von SUN den Speicher in verschiedene Bereiche unterteilt, darunter den Permenterbereich, in dem häufig verwendete Klassen und Klassenbeschreibungen gespeichert werden. Als SUN es ursprünglich entwarf, dachte er, dass dieser Bereich beim Start der JVM behoben werden würde, aber er hatte nicht erwartet, dass Dynamik jetzt so weit verbreitet sein würde. Darüber hinaus verfügt dieser Bereich über einen speziellen Garbage-Collection-Mechanismus. Das Problem besteht nun darin, dass GC sie nach dem dynamischen Laden von Klassen in diesen Bereich überhaupt nicht sammeln kann!
1. Der erste ist: java.lang.OutOfMemoryError: Java-Heap-Speicherplatz
Erklärung:
Heap-Größeneinstellung
Die JVM-Heap-Einstellung bezieht sich auf Java Die JVM kann die während der Programmausführung verwendeten Speichereinstellungen zuweisen. Die JVM legt beim Start automatisch den Wert der Heap-Größe fest. Ihr anfänglicher Speicherplatz (d. h. -Xms) beträgt 1/64 des physischen Speichers und den maximalen Speicherplatz (-Xmx) ist 1/4 des physischen Speichers. Sie können die Option -Xmn -Xms -Xmx und andere von der JVM bereitgestellte Optionen verwenden, um dies festzulegen. Die Heap-Größe ist die Summe aus Young Generation und Tenured Generation.
Tipp: Wenn in der JVM 98 % der Zeit für GC verwendet werden und die verfügbare Heap-Größe weniger als 2 % beträgt, wird diese Ausnahmemeldung ausgegeben.
Tipp: Die maximale Heap-Größe sollte 80 % des verfügbaren physischen Speichers nicht überschreiten. Im Allgemeinen sollten die Optionen -Xms und -Xmx auf den gleichen Wert gesetzt werden und -Xmn sollte 1/4 des -Xmx-Werts betragen .
Lösung:
Heap-Größe manuell festlegen
Ändern Sie TOMCAT_HOME/bin/catalina.bat und fügen Sie die folgende Zeile über „echo „Using CATALINA_BASE: $CATALINA_BASE““ hinzu:
set JAVA_OPTS=%JAVA_OPTS% -server -Xms800m -Xmx800m -XX:MaxNewSize=256m
Oder ändern Sie catalina.sh
Fügen Sie die folgende Zeile über „echo „Using CATALINA_BASE: $CATALINA_BASE““ hinzu:
JAVA_OPTS="$JAVA_OPTS -server -Xms800m -Xmx800m -XX:MaxNewSize=256m" [html] 2、其次是:java.lang.OutOfMemoryError: PermGen space 原因: PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很CLASS的话,就很可能出现PermGen space错误,这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。 解决方法: 1. 手动设置MaxPermSize大小 修改TOMCAT_HOME/bin/catalina.bat(Linux下为catalina.sh),在 [code] “echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行: set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=128M -XX:MaxPermSize=512m
catalina.sh lautet wie folgt:
JAVA_OPTS="$JAVA_OPTS -server -XX:PermSize=128M -XX:MaxPermSize=512m"
Weitere Artikel zu JVM-Speicherüberlauflösungen (wie man JVM-Speicherüberlauf löst) finden Sie auf der chinesischen PHP-Website!