Ich habe das Standardspeicherlimit der Java Virtual Machine beim Ausführen der Java-Anwendung so eingestellt ...
%Vor%Ich weiß, dass dies den maximalen Speicherzuweisungs-Pool auf 128 MB setzen wird, aber ich weiß nicht, welchen Vorteil es hat, dieses Speicherlimit von JVM anzugeben?
Bitte erleuchten Sie mich in dieser Ausgabe ...
Auf Suns 1.6 JVM, auf einer Server-Klasse-Maschine (gemeint ist eine mit 2 CPUs und mindestens 2 GB physikalischer Speicher ) ist die standardmäßige maximale Heap-Größe die kleiner 1/4 des physischen Speichers oder 1 GB . Mit -Xmx
können Sie das ändern.
Warum möchten Sie die Speichermenge begrenzen, die Java verwendet? Zwei Gründe.
Erstens, Java's automatische Speicherverwaltung tendiert dazu, so viel Speicher wie möglich vom Betriebssystem zu holen und es dann für das Programm zu verwalten. Wenn Sie andere Programme auf dem gleichen Computer wie Ihr Java-Programm ausführen, werden Sie mehr als nur einen Teil des Speichers belegen und Druck auf sie ausüben. Wenn Sie mehrere Kopien Ihres Java-Programms ausführen, werden sie miteinander konkurrieren, und Sie können einige Instanzen mit Speichermangel enden. Wenn Sie die Größe des Heapspeichers begrenzen, können Sie das verwalten: Wenn Sie über 32 GB RAM verfügen und vier Prozesse ausführen, können Sie jeden Heap auf etwa 8 GB begrenzen (ein bisschen weniger wäre besser) und sich darauf verlassen, dass alle davon funktionieren bekomme die richtige Menge an Speicher.
Zweitens (ein anderer Aspekt der ersten, wirklich), wenn ein Prozess mehr Speicher ergreift, als das Betriebssystem aus dem physischen Speicher liefern kann, verwendet er virtuellen Speicher, der auf die Festplatte ausgelagert wird. Das ist sehr langsam. Java kann seine Speichernutzung reduzieren, indem es seinen Garbage Collector härter arbeiten lässt. Dies ist auch langsam - aber nicht so langsam wie auf der Festplatte. Sie können also die Größe des Heapspeichers begrenzen, um zu verhindern, dass der Java-Prozess ausgelagert wird, und so die Leistung verbessern.
Es gab bereits eine Frage zu Java und Speicher SO: Java-Speicher erklärt
Ein sehr schöner Artikel über Java-Speicher findet sich hier . Es gibt einen Überblick über das Gedächtnis, wie es benutzt wird, wie es gereinigt wird und wie es gemessen werden kann.
Die Standardeinstellungen des Speichers sind (vor Java 6):
-Xms Größe in Bytes Legt die anfängliche Größe des Java-Heapspeichers fest. Das Standardgröße ist 2097152 (2 MB). Die Werte müssen ein Vielfaches von und sein größer als 1024 Bytes (1 KB). (Das -server Flag erhöht die Standardgröße bis 32M.)
-Xmn Größe in Bytes Legt die anfängliche Java-Heap-Größe für Eden fest Generation. Der Standardwert ist 640 KB. (Das -server-Flag wird größer die Standardgröße auf 2M.)
-Xmx Größe in Bytes Legt die maximale Größe für den Java-Heap fest wachsen. Die Standardgröße ist 64M. (Das -server Flag erhöht die Standardgröße bis 128M.) Das maximale Heap-Limit beträgt ca. 2 GB (2048 MB).
Eine andere Quelle ( hier ) besagt, dass in Java 6 die Größe des Standard-Heapspeichers von der Größe des Systemspeichers abhängt.
Ich nehme an, dass dies helfen sollte, einen hohen Speicherverbrauch zu vermeiden (aufgrund von Fehlern oder aufgrund vieler Zuweisungen und Freigaben). Sie würden dies verwenden, wenn Sie für ein System mit wenig Arbeitsspeicher entwerfen (z. B. einen alten Computer mit wenig Arbeitsspeicher, Mobiltelefonen usw.).
Alternativ können Sie das Standard-Speicherlimit erhöhen, wenn es nicht genug für Sie ist und Sie OutOfMemoryException
s für normales Verhalten erhalten.