2012-06-21 6 views
6

Ich bin von Zeit zu Zeit in Eclipse-Aufgaben, die sehr viel Speicher benötigen. Also jvm während der Task läuft schluckt etwa 2-3 GB RAM, das ist in Ordnung. Aber sobald jvm diesen Speicher genommen hat, wird er nicht freigegeben und ich habe eine Situation, wenn der verwendete Speicher im Heap ungefähr 200 MB mit einer Gesamtspeichergröße von ungefähr 3 GB ist und das wirklich unerwünscht ist, da andere Programme nach Speicher hungern.zwingen jvm, nativen Speicher zurückzugeben

Ich versuchte Max/MinHeapFreeRatio Parameter, um jvm zu zwingen, den Verbrauch eines ungenutzten Speichers zu reduzieren. Das ist meine Finsternis config.ini Datei:

-startup 
plugins/org.eclipse.equinox.launcher_1.2.0.v20110502.jar 
--launcher.library 
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.100.v20110502 
-vm 
c:/Program Files/Java/jdk1.6.0_26/bin/javaw.exe 
-showlocation 
-product 
org.eclipse.epp.package.jee.product 
--launcher.defaultAction 
openFile 
--launcher.XXMaxPermSize 
256M 
-showsplash 
org.eclipse.platform 
--launcher.XXMaxPermSize 
256m 
--launcher.defaultAction 
openFile 
-vmargs 
-Duser.name=Michael Nesterenko 
-Dosgi.requiredJavaVersion=1.5 
-Xms512m 
-Xmx4096m 
-XX:MinHeapFreeRatio=10 
-XX:MaxHeapFreeRatio=30 

Aber das nicht hilft, habe ich noch Situationen, wenn es viele nicht verwendete Speicher.

+0

Ist es praktisch, zwei verschiedene short-cuts/shell-Skripte zum Starten von Eclipse zu haben, mit verschiedenen Parametersätzen, wenn Sie die speicherintensiven Aufgaben erledigen müssen? –

Antwort

4

Java weist die maximale Heap-Größe zu, wenn es als virtueller Speicher gestartet wird. Da es den Speicher verwendet, wird es als echter Hauptspeicher zugewiesen. Es verkleinert diese Größe nie. Die einzige Möglichkeit, diesen Speicher freizugeben, besteht darin, dass das Programm beendet wird.

Java wird seine Speichernutzung komprimieren, so viele der Seiten, die es zuvor verwendet hat, können auf die Festplatte ausgelagert werden, dies kann jedoch zu einer erheblichen Leistungseinbuße führen, wenn sie erneut benötigt wird.

+5

Ich stimme nicht zu. Der Speicher kann schrumpfen. In diesem Dokument (http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html): '-XX: MaxHeapFreeRatio = 70 \t Maximaler Prozentsatz der freien Heaps nach GC, um ein Schrumpfen zu vermeiden. 'Wenn mehr als 70% des Heaps frei sind, wird der Heap verkleinert. Auch in diesem Fehlerbericht (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6498735) heißt es: 'Die HotSpot JVM wird bereits Speicher zurück an das Betriebssystem freigeben, wenn sie nicht für Live-Java-Objekte benötigt wird .' –

+0

Der verwendete Heap wird verkleinert, die residente Größe der Anwendung jedoch nicht. »Ich weiß auch nicht, worüber der Bug-Reviewer spricht. Ich habe NIEMALS gesehen, wie der virtuelle Speicher verkleinert wird. ' –

+0

Eigentlich virtueller Speicher ist kein Problem, es kann jede Größe sein, wie es privat ist. Ich muss Prozessarbeitsmenge reduzieren - das ist die physische RAM-Nutzung. –

0

Ich empfehle, dass Sie die 2. „stolsvik“ 's Kommentare zu diesem Java Bug/rfe lesen - http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6498735 Es ziemlich ausführlich erklärt, wie die -XX:MinHeapFreeRatio und -XX:MaxHeapFreeRatio Optionen funktionieren.

Wenn das nicht hilft, könnten Sie versuchen, einen GC ein paar Mal zu erzwingen, um zu sehen, ob das zur Freigabe von Speicher führt. Und schalten Sie die GC-Protokollierung ein, um zu sehen, ob das etwas enthüllt.

Ein mögliches Problem, das die Speicherfreigabe möglicherweise behindern könnte, ist die Zuweisung von Nicht-Heap-Speicher durch die JVM; z.B. für Thread-Stapel, systemeigenen Codehaufen oder direkt zugeordnete Puffer.

Verwandte Themen