web-dev-qa-db-de.com

JVM-Heap-Parameter

Nach dem Lesen der bereits gestellten Frage zu diesem Thema und vielem googeln kann ich immer noch keine klare Sicht auf -Xms haben

Meine Frage ist: Was ist der Unterschied zwischen Java -Xms=512m -Xmx=512m und Java -Xms=64m -Xmx=512m?

Zur Zeit habe ich folgende Antwort:

Der einzige Unterschied besteht in der Anzahl der Speicherbereinigungen, die während des Laufs meiner Anwendung ausgeführt werden, und der Anzahl der Speicherzuordnungen. Habe ich recht ?

Hier sind meine Gründe für diese Antwort:

Wenn Sie die Option -Xms auf 512m setzen, verwendet meine Anwendung nach dem Start nicht wirklich 512M des physischen Speichers. Ich denke, das hängt mit der modernen Verwaltung des virtuellen Speichers von Betriebssystemen und dem Zuweisen von Lazy Pages zusammen. (Ich habe festgestellt, dass die Einstellung -Xms auf 512M oder auf 64M den anfänglich verwendeten Speicher nicht ändert, der entweder von top unter Linux oder vom Task-Manager unter Windows gemeldet wird.)

Kann mir jemand helfen, die Auswirkungen dieser Xms-Option zu verstehen, oder auf Links verweisen, die mir helfen, sie zu verstehen?

Danke im Voraus

Manu

64
Manuel Selva

So fassen Sie die nach dem Link gefundenen Informationen zusammen: Die JVM weist den von -Xms angegebenen Betrag zu, das Betriebssystem weist jedoch in der Regel keine echten Seiten zu, bis sie benötigt werden. Die JVM weist also den von Xms angegebenen virtuellen Speicher zu, der physische Speicher jedoch nur bei Bedarf.

Sie können dies sehen, indem Sie Process Explorer von Sysinternals anstelle des Task-Managers unter Windows verwenden.

Es besteht also ein echter Unterschied zwischen der Verwendung von -Xms64M und -Xms512M .. __ Ich denke, der wichtigste Unterschied ist der, auf den Sie bereits hingewiesen haben: Der Garbage Collector wird häufiger ausgeführt, wenn Sie wirklich die 512 MB benötigen, aber nur mit 64 MB beginnen .

34
Turismo

Die JVM beginnt mit der Speichernutzung auf der anfänglichen Heap-Ebene. Wenn der maxheap höher ist, wird er auf die maxheap-Größe anwachsen, wenn der Speicherbedarf den aktuellen Speicher übersteigt. 

So, 

  • -Xms512m -Xmx512m

JVM beginnt mit 512 M, wird nie skaliert.

  • -Xms64m -Xmx512m 

JVM beginnt mit 64M und wächst (bis zu einer Höchstgrenze von 512), wenn mem. Anforderungen übersteigen 64.

35
Steve B.

Abgesehen von den Standard-Heap-Parametern -Xms und -Xmx ist es auch gut zu wissen, -XX:PermSize und -XX:MaxPermSize, die zur Angabe der Größe des Perm-Gen-Bereichs verwendet werden, da Ihnen zwar Speicherplatz in anderen Generationen im Heap zur Verfügung stehen könnte, Sie jedoch möglicherweise nicht genügend Speicherplatz haben wird voll. Dieser Link bietet auch einen Überblick über Nice wichtige JVM-Parameter .

14
Seema Kiran

Die JVM passt den Heap adaptiv an, dh es wird versucht, die beste Heap-Größe für Ihre Anwendung zu ermitteln. -Xms und -Xmx gibt einfach den Bereich an, in dem die JVM den Heap betreiben und die Größe ändern kann. Wenn -Xms und -Xmx den gleichen Wert haben, bleibt die Heap-Größe der JVM auf diesem Wert konstant.

Normalerweise ist es am besten, -Xmx einzustellen und die JVM die beste Heapgröße ermitteln zu lassen, es sei denn, es gibt einen bestimmten Grund, warum Sie der JVM beim Start der JVM einen großen Heap geben müssen.

Wenn die JVM tatsächlich den Speicher vom Betriebssystem abfragt, hängt dies meiner Meinung nach von der Plattform und der Implementierung der JVM ab. Ich kann mir vorstellen, dass der Speicher erst angefordert wird, wenn Ihre App ihn tatsächlich benötigt. -Xmx und -Xms reservieren nur den Speicher.

5
bajafresh4life

wenn Sie Folgendes geschrieben haben: - Xms512m -Xmx512m Beim Start weist Java in diesem Moment 512 m RAM für seinen Prozess zu und kann nicht inkrementieren.

-Xms64m -Xmx512m Beim Start weist Java nur 64m RAM für seinen Prozess zu, aber Java kann seine Speicherbelegung während 512m erhöhen.

Ich denke, das zweite ist besser, weil Sie Java die automatische Speicherverwaltung geben.

4
Tommaso Taruffi

Ich habe dieses Spielzeugbeispiel in scala, my_file.scala erstellt:

object MyObject {

    def main(args: Array[String]) {
        var ab = ArrayBuffer.empty[Int]

        for (i <- 0 to 100 * 1000 * 1000) {
            ab += i
            if (i % 10000 == 0) {
                println("On : %s".format(i))
            }
        }
    }
}

Ich lief es mit:

scala -J-Xms500m -J-Xmx7g my_file.scala

und

scala -J-Xms7g -J-Xmx7g my_file.scala

In der -Xms500m-Version gibt es sicherlich merkliche Pausen. Ich bin sicher, dass die kurzen Pausen Speicherbereinigungsläufe sind und die langen Pufferspeicher Haufen.

0
Akavall