Muss man bei Java RAM festlegen?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Xms und Xmx sind Optionen, die die für den Java-Prozess benutzbare Heap-Größe angeben.

Java benutzt aber insgesamt im RAM mehr als den Heap-Speicher. Das bedeutet, dass trotz derm Einstellung Xmx=1024M Java durchaus mehr Speicher verbrauchen kann - und auch tut. Das fällt bei kleineren Programmen nicht auf, aber bei riesigen Applikationen macht sich das schon bemerkbar.

Neben dem Heap gibt es noch den Stack als Speicherbereich. Dessen Größe ist auch begrenzt, diese Begrenzung kann man aber nicht durch Xms und Xmx beeinflussen. Der Stack ist auch nicht der Teil, in dem hauptsächlich die Java-Objekte liegen, sondern wird eher für lokale Variablen oder Funktionsparameter verwendet.

Wofür verwendet Java den Arbeitsspeicher, wenn du java -Xmx2G -jar ./Test.jar eingibst?

Zum einen braucht die Laufzeitumgebung JVM selbst einen gewissen Anteil an RAM.

Dann hast du den von oben bekannten Stack, der wird auch im RAM gespeichert

Und dann gibt es noch den Heap, in dem alle Objekte und dynamisch erzeugten Dinge liegen. Im Heap liegt der Bärenanteil des verwendeten Speichers.

Was machen die Optionen?

Xms reserviert eine minimum vorhandene Heap-Größe und

Xmx begrenzt die vom Java-Programm verwendbare Heap-Größe.

Xms und Xmx haben Standardwerte, die von der Menge des vorhandenen Arbeitsspeichers abhängen und die für die meisten Anwendungsfälle reichen.

Allerdings kann es bei umfangreicherer Server-Software durchaus mal sein, dass die Standardwerte nicht ausreichen und dann muss man etwas nachjustieren.

Woher ich das weiß:Berufserfahrung – Berufserfahrung

Gut erklärt. Und wenn der heap Speicher langsam volläuft, startet die Garage collection und räumt nicht mehr benötigte Daten auf ( ganz vereinfacht ausgedrückt). Wenn man hier G1GC verwendet ist es sehr wichtig, xms und xmx auf den gleichen Wert zu setzen, da sonst die heap Größe öfter angepasst wird und jedes Mal alle Speicherbereiche im heap verändert werden müssen, was unnötig Rechenzeit kostet.

Zusätzlich gibt es noch den Codecache und metaspace ab java11. Die lassen sich auch über Parameter limitieren

0

Nein, das brauchst du nur wenn du "besonders viel Speicher" brauchst. Ich weiß nicht was die Standardeinstellung ist.

Woher ich das weiß:Studium / Ausbildung – Informatik studiert und mit PCs & Technik beschäftigt