Wie stelle ich die maximale Speichernutzung für JVM ein?

132

Ich möchte den maximalen Speicherplatz der JVM begrenzen. Beachten Sie, dass dies nicht nur der Heap ist, sondern dass ich den von diesem Prozess verwendeten Gesamtspeicher begrenzen möchte.

Erotik
quelle

Antworten:

94

Verwenden Sie die Argumente -Xms<memory> -Xmx<memory>. Verwenden Sie Moder Gnach den Zahlen, um Megs bzw. Gigs von Bytes anzuzeigen. -Xmsgibt das Minimum und -Xmxdas Maximum an.

Prabhu R.
quelle
1
Vielleicht möchten Sie sich auch MaxPermSize ansehen.
Urmalp
89
Er fragt nach dem JVM-Speicher. Was Sie gesagt haben, ist die Heap-Größe. Sie sind beide unterschiedlich
vsingh
8
Um zu wiederholen, was in den anderen Kommentaren erwähnt wird, konfigurieren Xms und Xmx nur den Heap. Obwohl sich die Konfiguration dieser Variablen indirekt auf den Nicht-Heap-Speicherplatz auswirkt, versucht die Person, die die Frage stellt, festzustellen, ob es eine Möglichkeit gibt, die gesamte Speichernutzung (Heap + Nicht-Heap) zu konfigurieren
Murungu
2
uhu. Also habe ich eingestellt -Xmx524Mund der Prozess nimmt 1,2 GB RAM ein. (?)
phil294
7
Dies ist nicht die richtige Antwort. Die Optionen -Xms und -Xmx regeln nur die Größe des JVM-Heapspeichers, nicht die gesamte Speicherzuordnung.
Peter De Winter
31

Sie sollten sich keine Sorgen machen müssen, dass der Stapel Speicher verliert (dies ist höchst ungewöhnlich). Das einzige Mal, dass der Stapel außer Kontrolle geraten kann, ist eine unendliche (oder wirklich tiefe) Rekursion.

Dies ist nur der Haufen. Entschuldigung, ich habe Ihre Frage zuerst nicht vollständig gelesen.

Sie müssen die JVM mit dem folgenden Befehlszeilenargument ausführen.

-Xmx<ammount of memory>

Beispiel:

-Xmx1024m

Dies ermöglicht maximal 1 GB Speicher für die JVM.

jjnguy
quelle
1
Das ist nicht wahr, laut diesem Thread gibt es mehrere Möglichkeiten, wie Sie außerhalb des Heaps stackoverflow.com/questions/1475290/…
erotsppa
Sie haben Recht, es gibt viele Möglichkeiten, Speicherprobleme zu haben, die nicht mit dem Stapel zusammenhängen. Sie sind jedoch nicht sehr häufig.
jjnguy
9
Sie sind sich ziemlich sicher, dass Sie die Größe des Nicht-Heap-Speichers nicht steuern können, oder?
Matt b
Ziemlich sicher, dass Sie es über steuern können -XX:MaxDirectMemorySize. Nicht, dass ich stark profiliert hätte, um sicherzugehen, aber trotzdem;)
alexandergunnarson
2
@alexandergunnarson Das MaxDirectMemorySizebetrifft nur NIO-Puffer. Alle Arten anderer nativer Speicher werden von der JVM verwendet.
Christopher Schultz
16

Wenn Sie den Speicher für jvm (nicht die Heap-Größe) einschränken möchten, ulimit -v

In diesem hervorragenden Artikel http://blogs.vmware.com/apps/2011/06/taking-a-closer-look-at-sizing-the- finden Sie eine Vorstellung vom Unterschied zwischen JVM- und Heap-Speicher. java-process.html

vsingh
quelle
8
Ist ulimitein Linux-Befehl? Ich habe eine schnelle Google-Suche durchgeführt und keine Beziehung zwischen ulimitund der JVM festgestellt. Y
Sam
11

Die obige Antwort ist irgendwie richtig. Sie können nicht genau steuern, wie viel nativen Speicher ein Java-Prozess zuweist. Dies hängt davon ab, was Ihre Anwendung tut.

Abhängig von der Plattform können Sie jedoch möglicherweise einen Mechanismus verwenden, z. B. ulimit, um die Größe eines Java oder eines anderen Prozesses zu begrenzen.

Erwarten Sie nur nicht, dass es ordnungsgemäß fehlschlägt, wenn es diese Grenze erreicht. Native Speicherzuweisungsfehler sind viel schwieriger zu behandeln als Zuordnungsfehler auf dem Java-Heap. Es besteht eine ziemlich gute Chance, dass die Anwendung abstürzt, aber je nachdem, wie wichtig es für das System ist, die Prozessgröße so gering wie möglich zu halten.

SmoothieMonster
quelle
1

Der NativeHeap kann um -XX erhöht werden: MaxDirectMemorySize = 256M (Standard ist 128)

Ich habe es nie benutzt. Vielleicht finden Sie es nützlich.

Mario Trucco
quelle
1
Ich bezweifle, dass op dies wollte: Der native Speicher wird verwendet, wenn Sie C / C ++ - Code von Java aus aufrufen.
Om-Nom-Nom
6
Der native Speicher wird auch bei Nio-Aufrufen verwendet, wenn Sie die Puffer mit direktem Speicher zuweisen. (... und Klassenlader und Thread-Informationen ....)
stu