Frage

Ich bin mit Tomcat6 in Suns JRE6 und jedes Paar setzt ich OutOfMemoryException bekommen: PermGen. Ich habe das Googeln von PermGen Lösungen gemacht und versucht, viele Fehlerbehebungen. Keine Arbeit. Ich lese viele gute Dinge über Oracle JRockit und wie seine PermGen Zuordnung kann Gigs in Größe (vergleiche Sun 128M) und während sie das Problem nicht lösen, wäre es mir erlauben, 100mal zwischen PermGen Ausnahmen zu umschichten im Vergleich zu 2 mal jetzt.

Das Problem mit JRockit ist es in der Produktion zu verwenden, müssen Sie WebLogic kaufen, die Tausende von Dollar kostet. Welche andere (frei) Optionen existieren, die tolerante von PermGen Expansion? Wie machen die unten JVMs in diesem Bereich?

  • IBM JVM
  • Öffnen JDK
  • Blackdown
  • Kaffe

... andere?

Update: Einige Leute haben gefragt, warum ich dachte PermGen max 128M war. Der Grund ist, weil jedes Mal, wenn ich versuche, es nicht über 128M meiner JVM zu erhöhen initialisieren:

[2009-06-18 01:39:44] [info] Error occurred during initialization of VM [2009-06-18 01:39:44] [info] Could not reserve enough space for object heap [2009-06-18 01:39:44] [395 javajni.c] [error] CreateJavaVM Failed

Es ist seltsam, dass es fehlschlägt versucht, Raum für das Objekt zu reservieren heap , obwohl ich nicht sicher bin, es ist „die“ Halde statt „ein“ Haufen.

ich booten die JVM mit 1024MB Anfangs- und 1536MB max Heap.

Ich werde diese Frage schließen, da es beantwortet wurde, das heißt. „Schalten ist nutzlos“ und fragt stattdessen Warum wird meine Sun JVM nicht mit größeren PermGen Einstellungen?

War es hilfreich?

Lösung

ich mit Michael Borgwardt einverstanden, dass Sie die PermGen Größe erhöhen, kann ich nicht zustimmen, dass es in erster Linie aufgrund von Speicherlecks ist. PermGen Raum wird von Anwendungen aggressiv aufgefressen, die starke Nutzung von Reflection implementieren. Also im Grunde, wenn Sie eine Frühjahr / Hibernate Anwendung haben in Tomcat ausgeführt wird, hergestellt werden, viel zu stoßen, dass PermGen Platz.

Andere Tipps

Wie sind Sie auf die Idee, die von Sun JVM auf 128M PermGen beschränkt ist? Sie können es frei mit der -XX gesetzt: MaxPermSize Befehlszeilenoption; die Standardeinstellung ist 64M.

Allerdings ist die eigentliche Ursache des Problems wahrscheinlich ein Speicherverlust in der Anwendung, die die Klassen ab, Müll gesammelt verhindert; diese können sehr subtil sein, vor allem, wenn Classloader beteiligt sind, da alles was man braucht eine einzige Verweis auf jede der Klassen ist, überall. dieser Artikel das Problem im Detail beschreibt, und dieses Wege schlägt vor, es zu beheben.

Technisch ist der „PermGen“ Speicherpool eine Sun JVM Sache. Andere JVMs nennen Sie es nicht, aber sie alle haben die Idee von einem oder mehreren nicht-Heap-Speicher-Pools.

Aber wenn Sie ein Problem mit Permgen in Ihrem Sun JVM haben, auf eine andere JVM in Bewegung ist sehr unwahrscheinlich, etwas zu lösen, es wird nur selbst manifestieren unter einem anderen Namen.

Wenn mehrere Umschichtungen Ihre Probleme verursachen, verstärkt nur die PermGen VM bis zu großen Werten. Wir haben versucht, JRockit eine Weile zurück, weil dieses sehr Problem, und es leidet unter dem gleichen Umschichtung Erschöpfung. Wir zogen zurück zu Sun JVM.

JVM zu ändern, ist kein Allheilmittel. Sie können neue unerwartete Probleme bekommen (siehe zB Artikel über eine Anwendung unter 4 verschiedenen JVM starten).

  • Sie können eine Klasse Leck (zum Beispiel über Klassenladeprogramme), die meist häufig auf redeploy passieren. Ehrlich gesagt, habe ich noch nie heiße redeploy auf Tomcat arbeiten sehe (hofft, einen Tag zu sehen).
  • Sie können falsche JVM Paramater (zB für Sun JDK 6 64 Bit -XX: + UseParNewGC Schalter führt PermGen Segment Speicher zu verlieren Wenn Sie zusätzliche Schalter hinzu:. -XX: + UseConcMarkSweepGC -XX: + CMSClassUnloadingEnabled-XX: + CMSPermGenSweepingEnabled wird die Situation gelöst. Komisch, aber ich nie oben erwähnt Leck mit Sun JDK 6 32 Bit) erfüllen. Link- einem Artikel "Tuning JVM Garbage Collection für Produktion Deployments".
  • Ihr PermGen Brocken kann nicht genug sein, Klassen zu laden und damit verbundene Informationen (das tatsächlich am häufigsten nach unter Tomcat umschichten passiert, alte Klassen bleiben in Erinnerung und neue zu laden)

Aus meiner bisherigen Erfahrung Debuggen diese Art von Leck ist eine der heikelsten Art von Debugging, die ich je hatte.

[UPDATED]

Nützliche Artikel wie Classloader Link auf eine Anwendung redeploy zu beseitigen.

Ich benutze JRockit und ich immer noch PermGen Fehler, wenn ich stoßen nicht (über -XX: MaxPermSize) Speicher. Ich kann auch nicht bekommen alles zu vermeiden, arbeiten immer diese (anders als es erhöht wird).

Perm Gen ist wahrscheinlich die einfachste Speicher zu handhaben, ich bezweifle, dass es viel Unterschied zwischen den verschiedenen vm-Implementierungen sein würde.

Stellen Sie sicher, dass alle diese Tomcat configs, die in der Produktion auszuschalten markiert sind, werden in der Produktion ausgeschaltet.

Ja, einige Rahmenbedingungen, die eine Menge von Klassen einer der Fliegen erzeugen, aber sie sollten nach selbst werden Aufräumen, und in jedem Fall können Sie mehr als ein paar Klassen in 128Mb passen.

Im Ernst, wenn perm gen geht Schritt hält das ist dann ein Leck eines festgelegt werden soll, wenn es nicht Ihr Problem zu beheben sein kann.

Die IBM JVM nicht (und tat es nicht in 2009) haben eine Permgen. Sie können mehr über seine Generations-Concurrent-Garbage-Collector das ist der Standard GC für Java 7.

Ich habe manchmal das Eclipse-IDE auf IBM JVM speziell, weil mit meiner Lieblings-Plugins laufen würde es häufig die HotSpot JVM Permgen aufzufüllen. Sicher, es war wahrscheinlich ein Speicherleck auf, dass jemand behoben haben sollte, aber in der Zwischenzeit war mein IDE nicht abstürzt und ich war mit verschiedenen Einstellungen nicht beschäftigt zu experimentieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top