2009-03-23 7 views
27

Alle 15-30 Minuten zeigt Netbeans eine "java.lang.OutOfMemoryError: PermGen space". Von dem, was ich von Google gelernt habe, scheint dies mit Klassenlader-Lecks oder Speicherlecks im Allgemeinen zu tun zu haben.Wie kann ich PermGen Raumfehler in Netbeans verhindern?

Leider waren alle Vorschläge, die ich fand, mit Anwendungsservern verbunden, und ich habe keine Idee, sie an Netbeans anzupassen. (Ich bin mir nicht einmal sicher, es ist das gleiche Problem)

Ist es ein Problem in meiner Anwendung? Wie kann ich die Quelle finden?

+0

siehe auch http://stackoverflow.com/questions/717550/java-lang-outofmemoryerror-java-heap-space-with-netbeans – Steen

+0

Warum aktualisieren Sie nicht auf eine aktuellere Version von NetBeans? 6.5 ist wirklich alt. –

+4

@a_horse_with_no_name: Wie ist diese Frage. Ich habe es vor über drei Jahren gefragt. –

Antwort

32

es wegen der konstanten Klasse Laden ist.

Java speichert den Klassenbyte-Code und alle Konstanten (z. B. String-Konstanten) im permanenten Heap, die standardmäßig nicht als Garbage Collections erfasst werden (was in den meisten Situationen Sinn macht, da Klassen nur einmal während der Lebensdauer einer Anwendung geladen werden).

In Anwendungen, die oft Klassen während eines ganzen Lebens zu laden, die sind:

  • Web- und Anwendungsserver während der heißen Umschichtung;
  • IDEs bei der Ausführung entwickelter Anwendungen (jedes Mal, wenn Sie in Netbeans auf die Schaltfläche "Ausführen" klicken oder die Eclipse-Klasse erneut laden, werden die Klassen Ihrer Anwendung neu geladen);
  • usw. Dieses Verhalten ist nicht korrekt, weil ein Heap voll schließlich füllt.

Sie müssen permanente Heap Garbage Collection aktivieren, um diesen Fehler zu vermeiden.

I Optionen verwenden

-XX:MaxPermSize=256M 
-XX:+CMSClassUnloadingEnabled 
-XX:+CMSPermGenSweepingEnabled 

(meine Finsternis gestoppt 3.4 zu werfen "java.lang.OutOfMemoryError: PermGen space" so ist es auch mit Netbeans funktionieren soll).

bearbeiten: beachten Sie, dass nur für Netbeans setzen Sie diese Optionen in: [Netbeans installation]\etc\netbeans.conf Sie sollten diese Optionen mit -J und fügen Sie sie in netbeans_default_options (siehe Kommentare in netbeans.conf für weitere Informationen) préfixe.

+0

OK, keine der Antworten hat wirklich geholfen, aber diese hat mir die meiste Zeit zwischen Neustarts gekauft :) –

+0

versuche, MaxPermSize auf 512M oder mehr zu reduzieren, weil Müllsammler permament hep immer noch nicht helfen wird, wenn eine Anwendung dort mehr speichert als sie speichert kann enthalten (die Menge der lebenden Permamanet-Objekte überschreitet die Kapazität der Dauerspeicher-Heap) –

+1

Die Argumente schienen für mich zu funktionieren (Byte-Code-Analyse von rt.jar in meinem Fall), aber ich erhielt die Warnung 'Bitte CMSClassUnloadingEnabled anstelle von CMSPermGenSweepingEnabled verwenden in der Zukunft ". Trotzdem funktioniert. – Grundlefleck

2

Sehen Sie diese link auf, wie man die Größe von PermSize einstellt. Wahrscheinlich ist dies kein Problem Ihres Codes, also wäre die einzige Lösung, die PermSize zu erhöhen. Ich habe festgestellt, dass dies oft passiert, wenn Sie mit JAXB arbeiten. Wenn Sie viele Bibliotheken verwenden, die wiederum von vielen anderen JAR-Dateien abhängig sind, ist die Standardgröße des PermGen-Bereichs möglicherweise nicht groß genug.

Sehen Sie diese Blog-Beiträge für weitere Informationen: Classloader leaks und How to fix the dreaded "java.lang.OutOfMemoryError: PermGen space"

1

Sie können durch Editieren der Datei /etc/netbeans.conf die Startoptionen von Netbeans JVM ändern. Ich habe oft diese Art von Fehlern, wenn ich eine Webapp entwickeln und ich sie oft bereitstellen. In diesem Fall starte ich Tomcat von Zeit zu Zeit neu. -J-XX:

4

Versuchen Sie das folgende Argument zu Netbeans netconf hinzufügen MaxPermSize = 256m

2

Wenn Sie eine Web-Anwendung entwickeln, versuchen Sie auf Server vm Option setzen

-Xmx512m -Xms512m -XX: MaxPermSize = 512m

zu Tools/Server gehen // Plattform/VM-Optionen (Netbeans 7.4)