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?

2voto

pfranza Punkte 3184

Es ist schwer zu sagen, wie sich die Speicherzuweisung auf die Geschwindigkeit auswirken wird. Es hängt vom Garbage-Collection-Algorithmus ab, den die JVM verwendet. Wenn Ihr Garbage Collector beispielsweise eine Pause einlegen muss, um eine vollständige Sammlung durchzuführen, dann hat der Collector, wenn Sie 10 mehr Speicher haben, als Sie wirklich benötigen, 10 mehr Speicherplatz zu bereinigen.

Wenn Sie Java 6 verwenden, können Sie die jconsole (im bin-Verzeichnis des jdk) verwenden, um sich an Ihren Prozess anzuhängen und zu beobachten, wie sich der Collector verhält. Im Allgemeinen sind die Kollektoren sehr intelligent und Sie werden keine Einstellungen vornehmen müssen, aber wenn Sie einen Bedarf haben, gibt es zahlreiche Optionen, die Sie verwenden können, um den Sammelprozess weiter zu optimieren.

1voto

Virus Punkte 167
> 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.

El -X Die Optionen sind nicht standardisiert und können ohne vorherige Ankündigung geändert werden.

(copy-paste)

1voto

user1540256 Punkte 151

Diese Frage habe ich mir immer gestellt, wenn ich an einer meiner Anwendungen gearbeitet habe, die eine große Anzahl von Threads pro Anfrage erzeugt.

Das ist also eine wirklich gute Frage, die zwei Aspekte hat:
1. Ob mein Xms- und Xmx-Wert gleich sein sollten
       - Die meisten Websites und sogar die Oracle-Dokumente deuten darauf hin, dass es dasselbe ist. Ich schlage jedoch einen Puffer von 10-20% zwischen diesen Werten vor, um Ihrer Anwendung eine Option zur Größenanpassung des Heaps zu geben, falls es zu plötzlichen hohen Verkehrsspitzen ODER einem zufälligen Speicherleck kommt.

2. Ob ich meine Anwendung mit einer geringeren Heap-Größe beginnen sollte
       - Die Sache ist also die: Egal, welchen GC Algo Sie verwenden (sogar G1), ein großer Heap hat immer einen gewissen Nachteil. Das Ziel ist es, das Verhalten Ihrer Anwendung zu identifizieren, welche Heap-Größe Sie Ihren GC-Pausen in Bezug auf Latenz und Durchsatz erlauben können.
              - Wenn Ihre Anwendung zum Beispiel viele Threads hat (jeder Thread hat 1 MB Stack im Native Memory und nicht im Heap), aber keinen großen Objektspeicher belegt, dann schlage ich einen niedrigeren Wert für Xms vor.
              - Wenn Ihre Anwendung viele Objekte mit einer zunehmenden Anzahl von Threads erzeugt, sollten Sie herausfinden, welchen Wert von Xms Sie festlegen können, um diese STW-Pausen zu tolerieren. Dies bedeutet, dass Sie die maximale Antwortzeit Ihrer eingehenden Anfragen ermitteln, die Sie tolerieren können, und die minimale Heap-Größe abstimmen.

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