JVM-Speicherverbrauch

9

Ich versuche, Tomcat auf einem System mit wenig Speicher (150-256 MB) auszuführen. Obwohl ich die JVM mit -Xmx64m starte (was sowieso die Standardeinstellung sein sollte), nimmt der Prozess sofort mehr als 200 MB in Anspruch.

Ich frage mich, warum die JVM selbst so viel Speicher benötigt oder ob es eine Möglichkeit gibt, dies zu optimieren. Sind andere JVMs für einen geringen Speicherverbrauch besser als die Sun-JVMs - und funktionieren sie mit Tomcat?

Draemon
quelle

Antworten:

5

Zusätzlich zum Heap (angegeben durch -Xmsund -Xmx) müssen Sie die Nicht-Heap-Bereiche einschließen. Diese schließen ein

  • Das Perm Gen, das auf 32-Bit-Systemen 64 MB und auf 64-Bit-Systemen zunächst 96 MB beträgt
  • Der Code-Cache, der je nach JVM zwischen 20 und 40 MB liegt
  • Der NIO-Pufferbereich (aus dem DirectByteBuffers gezogen wird) beträgt anfangs 64 MB

Es gibt auch den Arbeitsbereich der JVM selbst, der einige Dutzend MB betragen wird.

Sie sollten auch die automatische Größenanpassung der Sun JVM kennen, wenn Sie einen Computer der Serverklasse verwenden . Im Laufe der Zeit hat die Definition der Serverklasse (2 GB Speicher, mehr als ein Kern) eine gewisse Abwertung erfahren, und jetzt können die meisten Computer die -serverOptimierungen auslösen . Mein Rat ist immer, die -Xmsund -XmxEinstellungen anzugeben und zu bestehen, es -serversei denn, Sie können sich einen guten Grund nicht auch vorstellen.

Dave Cheney
quelle
Beachten Sie auch den virtuellen Speicher, den die JVM nur reserviert und noch nicht verwendet.
Steve Schnepp
Zwar werden die meisten dieser Segmente, wie der PermGen und der Code-Cache, beim Start zugewiesen, aber die meisten Kernel vermeiden es, diesen Segmenten Seiten zuzuweisen, bis sie benötigt werden.
Dave Cheney
1
Danke für die Info - ich denke das erklärt, wohin die Erinnerung geht. Gibt es eine Möglichkeit, diese Werte zu ändern? Noch besser wäre es, zu sehen, wie viel von jedem Abschnitt verwendet wurde - ich weiß nicht, ob Sie dies mit einem der Java-Debugging- / Überwachungstools tun können?
Draemon
1
Sie können pmap oder jmap verwenden, um sich ein Bild über die verschiedenen verwendeten Segmente zu machen. Die meisten gängigen Optionen (und ihre Standardeinstellungen) sind hier unter java.sun.com/javase/technologies/hotspot/vmoptions.jsp aufgeführt . Sie ändern sich häufig und unterliegen Unterschieden im Betriebssystem (normalerweise Stapelgröße) und im Bogen (64-Bit-Betriebssysteme implizieren im Allgemeinen größere JVM-Bereiche)
Dave Cheney,
3

Mit der Option -Xmx beschränken Sie die Größe des Heaps , den die JVM reserviert ... Es gibt zusätzliche Ressourcen, die die JVM benötigt ...

"Danke für den Speicher" * ist ein guter Artikel, der erklärt, wie eine JVM Speicher verwendet ...

Abgesehen davon könnten Sie IBMs JVM ausprobieren, es sollte mit Tomcat funktionieren. Sie wissen nicht, ob einige der kostenlosen JVM-Implementierungen funktionieren.

Trotzdem glaube ich nicht, dass eine Maschine mit so wenig Speicher etwas Gutes bringt. Java braucht nur Speicher.

* Da neue Benutzer keine Hyperlinks einreichen können, müssen Sie diesen Artikel selbst nachschlagen. Dies ist der erste Treffer bei Google für "Danke für den Speicher-IBM".

dertoni
quelle
3
ibm.com/developerworks/java/library/j-nativememory-linux - Link zum Artikel "Danke für die Erinnerung"
StackKrish
0

Eine nützliche Technik, die ich gefunden habe, ist die Verwendung der JMX-Überwachung, um genau zu sehen, wie viel Speicher vom Heap- und Permgen-Speicherplatz verwendet wird.

Richten Sie JMX in Tomcat wie hier beschrieben ein: http://tomcat.apache.org/tomcat-6.0-doc/monitoring.html

Verwenden Sie dann JConsole (wird mit JDK 5 oder JDK 6 geliefert) - das Speicher-Tag verfolgt den Speicherverbrauch im Laufe der Zeit.

Achten Sie auch auf sanfte Neustarts von Webapps. Wenn Sie eine Webanwendung neu laden, wird der Permgen-Speicherplatz nicht durch Müll gesammelt und im Laufe der Zeit aufgebaut. Sie müssen Tomcat vollständig stoppen / starten, um den Permgen-Speicherplatz zurückzugewinnen.

Will Glass
quelle
VisualVM kann auch anstelle von JConsole verwendet werden und bietet noch mehr Details, wenn Sie nach Speicherproblemen in der JVM suchen. Ich musste dies mehr als einmal verwenden, um Probleme zu finden.
Jeremy Bouse