Frage

Ich bin auf der Standard-Hebebühne (Maven und Steg) zu entwickeln. Ich bin immer wieder (einmal alle paar Tage) immer diese:

Exception in thread "7048009@qtp-3179125-12" java.lang.OutOfMemoryError: PermGen space
2009-09-15 19:41:38.629::WARN:  handle failed
java.lang.OutOfMemoryError: PermGen space

Das ist in meiner Dev-Umgebung. Es ist kein Problem, weil ich den Server neu starten halten. In dem Entfaltungs habe ich diese Probleme nicht, so dass es kein wirkliches Problem ist. Ich bin nur neugierig.

Ich weiß nicht, zu viel über die JVM. Ich glaube, ich bin richtig in der Annahme, dass eine permanente Generation Gedächtnis für Dinge wie Klassen und internierten Strings? Was ich mich erinnere ist ein bisschen mit dem .NET-Speichermodell gemischt ...

Gibt es Gründe, warum dies geschieht? Sind die Standardwerte nur crazily niedrig? Ist es mit allen Hilfsobjekten zu tun, die Scala für Funktionsobjekte und ähnliche FP Dinge zu schaffen haben? Jedes Mal, wenn ich Jetty mit neu geschriebenen Code neu starten (alle paar Minuten) Ich stelle mir es wieder lädt Klassen usw. Aber auch so kann es nicht‘, dass viele kann es? Und soll nicht die JVM der Lage sein, mit einer großen Anzahl von Klassen zu tun?

Prost

Joe

War es hilfreich?

Lösung

diesen Beitrag

  

Diese Ausnahme trat aus einem einfachen Grund:
   permgenspace ist, wo Klasseneigenschaften, wie zum Beispiel Methoden, Felder, Anmerkungen und auch statische Variablen, etc. sind in dem Java-VM gespeichert, aber dieser Raum hat die Besonderheit, nicht vom Garbage Collector gereinigt .   Also, wenn Ihr Webapp verwendet oder eine Menge von Klassen erstellt (I dynamische Generationen von Klassen denke), stehen die Chancen sind erfüllt dieses Problem.   Hier sind einige Lösungen, die mir loswerden diese Ausnahme erhalten geholfen:

  • -XX:+CMSClassUnloadingEnabled: Diese Einstellung ermöglicht die Garbage Collection in der permgenspace
  • -XX:+CMSPermGenSweepingEnabled: ermöglicht es das Garbage Collector auch Klassen aus dem Speicher entfernen
  • -XX:PermSize=64M -XX:MaxPermSize=128M: erhöht die Größe des Speichers auf dem permgenspace zugewiesen

Kann dies helfen könnte.

Bearbeiten Juni 2012 (fast 3 Jahre später):

Ondra Žižka Kommentare (und ich habe die Antwort oben aktualisiert):

  

JVM 1.6.0_27 sagt: Verwenden Sie bitte:

  • CMSClassUnloadingEnabled (Ob Klasse Entladen ermöglicht bei der Verwendung von CMS GC)
  • anstelle von CMSPermGenSweepingEnabled in der Zukunft

Die gesamte Hotspot JVM Optionen -. Die komplette Referenz mroe

Andere Tipps

Wenn Sie das sehen, wenn mvn jetty:run läuft, stellen Sie den MAVEN_OPTS.

Für Linux:

export MAVEN_OPTS="-XX:+CMSClassUnloadingEnabled -XX:PermSize=256M -XX:MaxPermSize=512M"
mvn jetty:run

Für Windows:

set "MAVEN_OPTS=-XX:+CMSClassUnloadingEnabled -XX:PermSize=256M -XX:MaxPermSize=512M"
mvn jetty:run

Sollte jetzt in Ordnung sein. Wenn nicht, erhöhen -XX:MaxPermSize.

Sie können auch diese dauerhaft an Ihre Umgebung setzen.

Dies ist wegen der Nachladen von Klassen, wie Sie vorgeschlagen. Wenn Sie viele Bibliotheken usw. die Summe der Klassen verwenden, werden für jeden Neustart schnell wachsen. Versuchen Sie die Überwachung Ihrer Anlegestelle Beispiel mit VisualVM um einen Überblick über den Speicherverbrauch zu erhalten beim Nachladen.

Die Mailingliste ( http://groups.google.com/group/liftweb/) ist das offizielle Support-Forum für Lift, und wo Sie in der Lage eine bessere Antwort zu erhalten. Ich weiß nicht, die Einzelheiten Ihres dev Setup (Sie nicht gehen sehr ins Detail), aber ich nehme an, Sie Ihren Krieg in Jetty sind Nachladen ohne es wirklich zu einem Neustart. Lift führt keine dynamische Klasse Generation (wie durch VonC oben vorgeschlagen), aber Scala kompiliert dann jede Schließung als eine separate Klasse. Wenn Sie das Hinzufügen und Verschlüsse, um Ihren Code im Laufe von mehreren Tagen zu entfernen, ist es möglich, dass zu viele Klassen geladen werden und nie entladen und zul Raum einnimmt. Ich würde vorschlagen, dass Sie die Optionen JVM-Optionen von VonC erwähnt ermöglichen oben und sehen, ob sie helfen.

Die permanente Generation ist, wo die JVM Zeug legt, der wird wahrscheinlich nicht wie benutzerdefinierte Classloader gesammelt werden (Müll).

Je nachdem, was Sie bereitstellen, kann die zul gen Einstellung gering sein. Einige Anwendungen und / oder Container Kombination haben einige Speicherlecks enthalten, so dass, wenn eine App nicht entfalteten bekommt manchmal einige Sachen wie Klassenlader werden nicht erfasst, was in der Perm Raum füllt somit den Fehler zu erzeugen Sie haben.

Leider zur Zeit die beste Option sein in diesem Fall auf maximal den zul Raum mit der folgende Jvm Flagge (Beispiel für 192m zul Größe) bis:

-XX:MaxPermSize=192M (or 256M)

Die andere Option ist, um sicherzustellen, dass entweder der Behälter oder der Rahmen nicht ein Speicherleck auf.

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