67 Stimmen

Geschwindigkeitskompromiss der Java-Optionen -Xms und -Xmx

Mit diesen beiden Befehlen

A:

$ java -Xms10G -Xmx10G myjavacode input.txt

B:

$ java -Xms5G -Xmx5G myjavacode input.txt

Ich habe zwei Fragen:

  1. Da der Befehl A mit seinen Parametern mehr Speicherplatz reserviert, wird A schneller laufen als B?
  2. Wie werden -Xmx y -Xms den laufenden Prozess und die Ausgabe meines Programms beeinflussen?

167voto

bruno conde Punkte 47059

El -Xmx Argument definiert die maximale Speichergröße, die der Heap für die JVM erreichen kann. Sie müssen Ihr Programm gut kennen und sehen, wie es sich unter Last verhält und diesen Parameter entsprechend einstellen. Ein niedriger Wert kann dazu führen, dass OutOfMemoryExceptions oder eine sehr schlechte Leistung, wenn der Heap-Speicher Ihres Programms die maximale Heap-Größe erreicht. Wenn Ihr Programm auf einem dedizierten Server läuft, können Sie diesen Parameter höher einstellen, da er andere Programme nicht beeinträchtigt.

El -Xms legt die anfängliche Heap-Speichergröße für die JVM fest. Das bedeutet, dass die JVM beim Starten Ihres Programms diese Menge an Speicher sofort zuweist. Dies ist nützlich, wenn Ihr Programm von Anfang an eine große Menge an Heap-Speicher verbraucht. Dadurch wird vermieden, dass die JVM den Heap ständig vergrößert, was zu einem Leistungsgewinn führen kann. Wenn Sie nicht wissen, ob dieser Parameter für Sie hilfreich ist, verwenden Sie es nicht .

Zusammenfassend lässt sich sagen, dass dies ein Kompromiss ist, den Sie allein auf der Grundlage des Speicherverhaltens Ihres Programms entscheiden müssen.

25voto

akarnokd Punkte 66673

Das hängt von der GC ab, die Ihr Java verwendet. Parallele GCs könnten bei größeren Speichereinstellungen besser funktionieren - ich bin allerdings kein Experte auf diesem Gebiet.

Im Allgemeinen gilt: Je größer der Speicher ist, desto seltener muss die GC durchgeführt werden - es gibt viel Platz für Speicherplatz. Wenn es jedoch zu einer GC kommt, muss die GC mit mehr Speicher arbeiten - was wiederum langsamer sein kann.

4voto

SaSConsul Punkte 288

Ich habe festgestellt, dass in manchen Fällen zu viel Speicher das Programm verlangsamen kann.

Ich hatte z. B. eine auf Hibernate basierende Transformations-Engine, die mit zunehmender Last langsam lief. Es stellte sich heraus, dass Hibernate jedes Mal, wenn wir ein Objekt aus der Datenbank abriefen, den Speicher auf Objekte überprüfte, die nie wieder verwendet werden würden.

Die Lösung bestand darin, die alten Objekte aus der Sitzung zu entfernen.

Stuart

3voto

cafebabe Punkte 1380
  1. Die Zuweisung hängt immer von Ihrem Betriebssystem ab. Wenn Sie zu viel Speicher zuweisen, kann es passieren, dass Sie Teile in den Swap-Speicher geladen haben, was in der Tat langsam ist.
  2. Ob Ihr Programm langsamer oder schneller läuft, hängt von den Referenzen ab, die die VM zu bearbeiten und zu bereinigen hat. Der GC muss den zugewiesenen Speicher nicht durchsuchen, um verlassene Objekte zu finden. Er kennt seine Objekte und die Menge an Speicher, die sie durch Referenz-Zuordnung belegen. Das Durchsuchen hängt also nur von der Größe Ihrer Objekte ab. Wenn sich Ihr Programm in beiden Fällen gleich verhält, sollte die einzige Auswirkung auf die Leistung beim Starten der VM auftreten, wenn die VM versucht, vom Betriebssystem bereitgestellten Speicher zuzuweisen, und wenn Sie den Swap verwenden (was wiederum zu 1. führt).

3voto

Tomer Punkte 549

Die Geschwindigkeitskompromisse zwischen den verschiedenen Einstellungen von -Xms und -Xmx hängen von der Anwendung und dem System ab, auf dem Sie Ihre Java-Anwendung ausführen. Es hängt auch von Ihrer JVM und anderen von Ihnen verwendeten Garbage-Collection-Parametern ab.

Diese Frage ist 11 Jahre alt, und seitdem ist es noch schwieriger geworden, die Auswirkungen der JVM-Parameter auf die Leistung im Voraus zu bestimmen. Sie können also verschiedene Werte ausprobieren und die Auswirkungen auf die Leistung sehen, oder ein kostenloses Tool wie Optimierer Studio die automatisch die optimalen JVM-Parameterwerte findet.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X