Ich habe ein Java-Programm, das 5 verschiedene Aufgaben ausführt. Wenn ich das Programm mit dem Parameter -Xmx512m speichere, laufen die Tasks 1-4 gut, aber Task 5 hat keinen Speicher mehr. Wenn ich das Programm mit -Xmx1024m ausführe, laufen alle 5 Aufgaben gut, aber die Aufgaben 1-4, die vorher mit 512m Heap gut gelaufen sind, verbrauchen jetzt fast den ganzen 1024m Heap. Das Gleiche passiert, wenn ich -Xms128m -Xmx1024m benutze.
Was wären die Speicherparameter, um JVM anzuweisen, die Speichernutzung niedrig zu halten (z. B. 512 m für Aufgaben 1-4) und nur mehr Speicher zu verwenden, wenn dies tatsächlich benötigt wird (z. B. im Fall von Aufgabe 5)?
Vielleicht muss ich den Garbage Collector öfter aktivieren als die Standardeinstellung?
Ich glaube, Sie haben ein Missverständnis darüber, wie die JVM funktioniert. Dies ist kein GC Problem oder ein "Task" Problem.
Ihre Aufgaben haben Speicherlecks oder sie sind entworfen, um mehr und mehr Speicher zu halten.
-Xmx1024m legt den maximalen Speicher fest, den die JVM zuweisen kann. Es wäre dasselbe, als hätten Sie nur 1024 MB physischen Speicher und keinen virtuellen Speicher.
Es wäre hilfreich, Ihre Frage mit der Definition der Aufgabe zu aktualisieren. Sind das 5 separate JVMs? Oder nur 5 Arbeitseinheiten in einer einzigen JVM.
Aktualisieren
Ich beabsichtige nicht, dass das Programm immer alle 1g-Heaps benutzt. Ich beabsichtige, die JVM anzuweisen, einen 512-m-Heap zu verwenden, wenn sie mehr Speicher verwalten und verwenden kann, wenn dies erforderlich ist. Wenn der Speicher nicht mehr benötigt wird, um auf 512 m oder noch weniger Speicher zurückzufallen.
Nur weil Sie -Xmx1024m gesetzt haben, bedeutet das nicht, dass die JVM all diesen Speicher benutzen wird. Es ist nur eine maximale Grenze. Setzen Sie Xms, bis Sie einen Mindestspeicherplatz eingestellt haben. Ihr Programm bestimmt letztendlich die laufende Menge des verwendeten Speichers. Wenn es das durch -Xmx festgelegte Limit erreicht, wirft es einen OutOfMemoryError
Sie können der JVM vorschlagen, den Garbage Collector durch Aufruf von System.gc()
auszuführen. Beachten Sie, dass ich vorschlagen kann, dass Sie den GC nicht zum Laufen zwingen können. Sie könnten auf einer Plattform laufen, die es ablehnt, sogar GC zu machen. Sie müssen auch prüfen, welchen GC-Algorithmus sie für Ihre Anwendung auswählt. Ich würde hier Tuning Garbage Collector suchen.
Wenn Sie so genaue Einstellungen für die Speichernutzung benötigen, müssen Sie etwas anderes als die JVM auswählen.
Diese beiden Parameter weisen auf den jvm-Wert hin, wenn die Heap-Größe angepasst werden muss:
%Vor%was ziemlich viel bedeutet, dass, wenn nach GC mehr als 10% des Heaps frei sind, versucht wird, den Speicher dem OS zurückzugeben. und es wird den Heap nur wachsen, wenn mehr als 90% des Heaps nach GC verwendet wird.
dies könnte Ihr Programm verlangsamen, weil der GC die zugewiesene Speichergröße ständig ändert. und es ist möglich, dass es überhaupt keine Wirkung hat, wenn Ihr Programm in kurzer Zeit viel Speicher zuweist.
Indem du -Xmx1024m an die VM übergibst, sagst du der VM im Grunde, dass sie bis zu 1 Gig-Heap verwenden kann, was sie schließlich tun wird. Die VM startet die Garbage Collection, wenn sie benötigt wird, z. Wenn der Heap aufgebraucht ist, hängt dies von der verfügbaren Heap-Größe ab. Wenn Sie wissen, welche Aufgabe außerhalb ausgeführt werden soll (was Sie wahrscheinlich tun, weil Sie sie als Parameter für die Befehlszeile übergeben), legen Sie die Option -Xmx auch von außerhalb fest?