Frage

Angesichts dieser beiden Befehle

A:

$ java -Xms10G -Xmx10G myjavacode input.txt

B:

$ java -Xms5G -Xmx5G myjavacode input.txt

Ich habe zwei Fragen:

  1. Seit den Befehl behält sich vor, mehr Speicher mit seinen Parametern, wird Ein schneller laufen als B?
  2. Wie -Xmx und -Xms Auswirkungen auf den Laufenden Prozess und die Ausgabe meines Programms?
War es hilfreich?

Lösung

Es hängt von der GC Ihre Java verwendet. Parallel GCs besser auf größere Speichereinstellungen funktionieren könnte -. Ich bin kein Experte auf diesem obwohl

In der Regel, wenn Sie größere Speicher die weniger häufig benötigt es GC-ed sein - es gibt viel Platz für Müll. Wenn es jedoch zu einem GC kommt, die GC hat auf mehr Speicher arbeiten -. Was wiederum könnte langsamer sein

Andere Tipps

Das -Xmx Argument legt die maximale Speichergröße, die die Heap für die JVM erreichen kann. Sie müssen Ihr Programm gut und sehen Sie wissen, wie es unter Belastung führt und setzen Sie diesen Parameter entsprechend. Ein niedriger Wert kann dazu führen, OutOfMemoryExceptions oder eine sehr schlechte Leistung, wenn Ihr Programms der Heap-Speicher die maximale Heap-Größe erreicht. Wenn Ihr Programm in dedizierten Server ausgeführt wird, können Sie diese Parameter höher eingestellt, weil es andere Programme beeinflussen würde nicht.

Das -Xms Argument legt die anfängliche Heap-Speichergröße für die JVM. Dies bedeutet, dass, wenn Sie Ihr Programm starten die JVM sofort diese Menge an Speicher zugewiesen wird. Dies ist nützlich, wenn Ihr Programm wird eine große Menge an Heap-Speicher von Anfang an verbrauchen. Dies vermeidet die JVM ständig den Heap zu erhöhen werden und es eine gewisse Leistung zu gewinnen. Wenn Sie nicht wissen, wenn dieser Parameter Sie helfen wird, nicht verwenden .

Insgesamt ist dies ein Kompromiss, den Sie nur in dem Speicherverhalten des Programms basieren entscheiden.

Ich habe festgestellt, dass zu viele Speicher in einigen Fällen ab das Programm verlangsamen.

Zum Beispiel hatte ich eine Hibernate-basierte Engine verwandeln, die sich langsam fing an zu laufen, wenn die Last erhöht. Es stellte sich heraus, dass jedes Mal, wenn wir ein Objekt aus dem db bekam, Hibernate wurde für Objekte Speicherüberprüfung, die nie wieder verwendet werden.

Die Lösung war, die alten Objekte aus der Sitzung zu vertreiben.

Stuart

  1. Aufteilung hängt immer von Ihrem Betriebssystem. Wenn Sie zu viel Speicher zuordnen, können Sie geladene Teile Swap am Ende mit, die in der Tat langsam ist.
  2. Ob Ihr Programm läuft langsamer oder schneller, hängt von den Referenzen der VM zu behandeln hat und zu reinigen. Die GC muss nicht durch den zugewiesenen Speicher fegen verlassenen Objekte zu finden. Es weiß, dass es Objekte und die Größe des Speichers sie Bezug Mapping zuordnen. So fegt hängt nur von der Größe der Objekte. Wenn Ihr Programm das gleiche in beiden Fällen verhält, sollte die einzige Auswirkung auf die Leistung auf VM Start sein, wenn der VM-Speicher vom Betriebssystem zur Verfügung gestellt zuzuordnen versucht, und wenn Sie den Swap verwenden (was wiederum führt zu 1).

Es ist schwer zu sagen, wie die Speicherzuweisung Ihre Geschwindigkeit auswirken. Es hängt von der Garbage Collection Algorithmus der JVM verwendet. Zum Beispiel, wenn Ihr Garbage Collector muss pausieren eine vollständige Sammlung zu tun, dann, wenn Sie 10 mehr Speicher, als Sie wirklich brauchen, dann wird der Kollektor 10 mehr Müll haben aufzuräumen.

Wenn Sie Java 6 verwenden Sie die jconsole (im Verzeichnis ist des JDK) verwenden kann, um Ihren Prozess zu befestigen und beobachten, wie der Sammler verhalten wird. Im Allgemeinen sind die Kollektoren sehr klug, und Sie werden keine Abstimmung tun müssen, aber wenn Sie ein Bedürfnis haben, gibt es zahlreiche Möglichkeiten, Ihnen die Sammlung Prozess nutzen, um abzustimmen haben.

> C:\java -X

-Xmixed           mixed mode execution (default)
-Xint             interpreted mode execution only
-Xbootclasspath:<directories and zip/jar files separated by ;>
                  set search path for bootstrap classes and resources
-Xbootclasspath/a:<directories and zip/jar files separated by ;>
                  append to end of bootstrap class path
-Xbootclasspath/p:<directories and zip/jar files separated by ;>
                  prepend in front of bootstrap class path
-Xnoclassgc       disable class garbage collection
-Xincgc           enable incremental garbage collection
-Xloggc:<file>    log GC status to a file with time stamps
-Xbatch           disable background compilation
-Xms<size>        set initial Java heap size
-Xmx<size>        set maximum Java heap size
-Xss<size>        set java thread stack size
-Xprof            output cpu profiling data
-Xfuture          enable strictest checks, anticipating future default
-Xrs              reduce use of OS signals by Java/VM (see documentation)
-Xcheck:jni       perform additional checks for JNI functions
-Xshare:off       do not attempt to use shared class data
-Xshare:auto      use shared class data if possible (default)
-Xshare:on        require using shared class data, otherwise fail.

Die -X Optionen sind Nicht-Standard und können sich ohne vorherige Ankündigung geändert werden.

(copy-paste)

Das war immer die Frage, die ich hatte, als ich arbeiten war eine meiner Anwendung, die massive Anzahl von threads pro Anfrage.

Das ist also eine wirklich gute Frage, und es gibt zwei Aspekte dieses:
1.Ob meine Xms und Xmx Wert sollte gleich sein
- Die meisten websites und sogar oracle-docs-Dokumente legen nahe, es zu werden die gleichen.Jedoch, ich schlage vor, einige 10-20% der Puffer zwischen diesen Werten zu geben heap Größenänderung eine option, um Ihre Anwendung in Fall die plötzliche hohe traffic-Spitzen ODER eine zufällige Speicher Leck.

2.Ob ich anfangen soll, meine Anwendung mit niedriger heap-Größe
- Also hier ist das Ding - egal was die GC-Algo, die Sie verwenden (auch G1), großer Haufen hat immer ein paar trade-off.Das Ziel ist es zu identifizieren, die das Verhalten Ihrer Anwendung auf, was heap-Größe können Sie Ihre GC-Pausen in Bezug auf Latenz und Durchsatz.
- Für Beispiel, wenn Ihre Anwendung viele threads (jeder thread hat 1 MB Stapel im systemeigenen Speicher und nicht in Haufen), aber nicht zu besetzen schweren Gegenstand Raum, dann schlage ich vor, haben einen niedrigen Wert von Xms.
- Wenn Sie Ihre Anwendung erstellt Menge von Objekten mit Zunehmender Anzahl der threads, dann ermitteln, mit welchem Wert der Xms-Sie können tolerieren diejenigen, STW Pausen.Dies bedeutet, identifizieren die max-Ansprechzeit von eingehenden Anfragen, die Sie tolerieren können, und nach der Melodie der Mindest-heap-Größe.

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