Frage

Dieses Problem geht es speziell um Sun Java JVM läuft auf Linux x86-64. Ich versuche herauszufinden Warum die Sun JVM so viel vom physischen Gedächtnis des Systems nimmt, selbst wenn ich Haufen und Nicht-heap-Grenzen festgelegt habe.

Das Programm, das ich ausführe, ist Eclipse 3.7 mit mehreren Plugins/Funktionen. Die am häufigsten verwendeten Funktionen sind PDT, z. B. MYLyn. Ich beginne die Sonnenfinsternis mit den folgenden Befehlszeilenschaltern:

-nosplash -vmargs -Xincgc -Xms64m -Xmx200m -XX:NewSize=8m -XX:PermSize=80m -XX:MaxPermSize=150m -XX:MaxPermHeapExpansion=10m -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly -XX:+UseParNewGC -XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing -XX:CMSIncrementalDutyCycleMin=0 -XX:CMSIncrementalDutyCycle=5 -XX:GCTimeRatio=49 -XX:MaxGCPauseMillis=50 -XX:GCPauseIntervalMillis=1000 -XX:+UseCMSCompactAtFullCollection -XX:+CMSClassUnloadingEnabled -XX:+DoEscapeAnalysis -XX:+UseCompressedOops -XX:+AggressiveOpts -Dorg.eclipse.swt.internal.gtk.disablePrinting

Beachten Sie besonders die Schalter:

-Xms64m -Xmx200m -XX:NewSize=8m -XX:PermSize=80m -XX:MaxPermSize=150m

Diese Schalter sollte den JVM-Haufen auf maximal 200 MB und nicht heap auf 150 MB beschränken ("CMS Permanent Generation" und "Code -Cache", wie von JConsole bezeichnet). Logischerweise sollte der JVM insgesamt 350 MB plus der interne Overhead der JVM dauern.

In Wirklichkeit dauert die JVM 544,6 MB Für meinen aktuellen Eclipse -Prozess, wie von ps_mem.py (berechnethttp://www.pixelbeat.org/scripts/ps_mem.py) die die realen physischen Speicherseiten berechnet, die vom Linux 2.6+ -Kernel reserviert sind. Das ist der interne Sonne JVM -Overhead von 35% oder ungefähr 200 MB!

Irgendwelche Hinweise darauf, wie man diesen Overhead verringert?

Hier sind einige zusätzliche Informationen:

$ ps auxw
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
me       23440  2.4 14.4 1394144 558440 ?      Sl   Oct12 210:41 /usr/bin/java ...

Und laut JConsole hat der Prozess 160 MB Haufen und 151 MB Nicht-Heap verwendet.

Ich sage nicht, dass ich es mir nicht leisten kann, zusätzliche 200 MB für den Ausführen von Eclipse zu verwenden, aber wenn es eine Möglichkeit gibt, diesen Abfall zu reduzieren, würde ich diese 200 MB lieber für Kernel -Block -Gerätepuffer oder Datei -Cache verwenden. Darüber hinaus habe ich ähnliche Erfahrungen mit anderen Java -Programmen - vielleicht könnte ich den Overhead für alle mit ähnlichen Verbesserungen reduzieren.

UPDATE: Nachdem ich die Frage veröffentlicht habe, fand ich früherer Beitrag zu SO:Warum konsumiert der Sun JVM weiterhin mehr RSS -Speicher, selbst wenn die Haufen usw. stabil sind?Es scheint, dass ich verwenden sollte pmap Um das Problem zu untersuchen.

War es hilfreich?

Lösung

Ich denke, der Grund für den hohen Speicherverbrauch Ihrer Eclipse -Umgebung ist die Verwendung von SWT. SWT ist eine native Grafikbibliothek, die außerhalb des Haufens des JVM lebt. Um die Situation zu verschlimmern, ist die Implementierung unter Linux nicht wirklich optimiert.

Ich glaube nicht, dass es wirklich die Möglichkeit gibt, den Speicherverbrauch Ihrer Eclipse -Umgebung in Bezug auf das Gedächtnis außerhalb des Haufens zu verringern.

Andere Tipps

Eclipse ist ein Speicher und ein CPU -Schweine. Zusätzlich zu den Java -Klassenbibliotheken wird das Low -End -GUI -Zeug von nativen Systemanrufen behandelt, sodass Sie eine wesentliche "native" JNI -Bibliothek haben, um die mit Ihrem Prozess verbundenen Laufanrufe mit niedriger Ebene X auszuführen.

Eclipse bietet Millionen nützlicher Funktionen und viele Helfer, um Ihre täglichen Programmieraufgaben zu beschleunigen - aber schlank und bedeuten, dass dies nicht der Fall ist. Jede Verringerung des Speichers oder der Ressourcen führt wahrscheinlich zu einer spürbaren Verlangsamung. Es hängt wirklich davon ab, wie viel Sie Ihre Zeit im Vergleich zum Speicher Ihres Computers schätzen.

Wenn Sie schlank und meine GVIM und Make wollen, sind unschlagbar. Wenn Sie den Code -Fertigstellung, automatische Builds usw. möchten, müssen Sie damit rechnen, dies mit zusätzlichen Ressourcen zu bezahlen.

Wenn ich das folgende Programm ausführe

public static void main(String... args) throws InterruptedException {
    for (int i = 0; i < 60; i++) {
        System.out.println("waiting " + i);
        Thread.sleep(1000);
    }
}

mit ps auwx Drucke

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
500      13165  0.0  0.0 596680 13572 pts/2    Sl+  13:54   0:00 java -Xms64m -Xmx200m -XX:NewSize=8m -XX:PermSize=80m -XX:MaxPermSize=150m -cp . Main

Die Menge des verwendeten Speichers beträgt 13,5 MB. Es gibt etwa 200 MB gemeinsame Bibliotheken, was zur VSZ -Größe zählt. Der Rest kann im maximalen Haufen, maximaler Gen mit einem Overhead für die Fadenstapel usw. berücksichtigt werden.

Das Problem scheint nicht mit der JVM zu sein, sondern bei der darin ausgeführten Anwendung. Mit zusätzlichen gemeinsam genutzten Bibliotheken können direkte Speicher- und Speicher -zugeordnete Dateien die verwendete Speichermenge erhöhen.

Wenn Sie ungefähr 16 GB für rund 100 US -Dollar kaufen können, wissen Sie, dass dies tatsächlich ein Problem ist?

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