-Xms und -Xmx in Java: So beschleunigen Sie die JVM und bringen den Server nicht zum Absturz

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Warum Ihr Java-Programm „lahmt“ und wie Sie es mit -Xms und -Xmx beheben?

\n

Haben Sie jemals eine Java-Anwendung gestartet, die anfangs wie am Schnürchen lief, aber nach einer Stunde anfing zu „lahmen“ und dann sogar mit einem OutOfMemoryError abstürzte? Oder verbrauchte der Server im Gegenteil den gesamten Arbeitsspeicher, nutzte aber nur 20%? Höchstwahrscheinlich liegt das Problem an den Heap-Einstellungen – -Xms und -Xmx. Diese beiden Parameter sind der Schlüssel zur Balance zwischen Leistung und Stabilität der JVM.

\n

In diesem Artikel analysieren wir, was -Xms und -Xmx tatsächlich bewirken, wie Sie sie richtig für Ihre Anwendung auswählen, und zeigen Codebeispiele, die Ihnen helfen, typische Fehler zu vermeiden. Bereit? Los geht's!

\n\n

Was sind -Xms und -Xmx? Analyse der JVM-Parameter

\n

Kurz gesagt: -Xms legt die anfängliche Heap-Größe fest, -Xmx die maximale. Aber der Teufel steckt, wie immer, im Detail.

\n
    \n
  • -Xms (Initial Heap Size) – die Speichermenge, die die JVM beim Start reserviert. Wenn Sie -Xms512m angeben, reserviert die virtuelle Maschine sofort 512 MB.
  • \n
  • -Xmx (Maximum Heap Size) – die obere Grenze, bis zu der der Heap wachsen kann. Beispielsweise bedeutet -Xmx4g, dass die JVM niemals mehr als 4 GB verwendet.
  • \n
\n

Warum ist das wichtig? Die JVM ist keine „gummibandartige“ Umgebung. Wenn Sie zu wenig Anfangsspeicher (-Xms) zuweisen, greift das Programm häufig auf den Garbage Collector (GC) zurück, um den Heap zu erweitern, was die Arbeit verlangsamt. Wenn Sie -Xmx zu groß einstellen, riskieren Sie, den gesamten Systemspeicher zu „fressen“, und das Betriebssystem beginnt auszulagern – die Leistung bricht drastisch ein.

\n\n

Praktisches Beispiel: So konfigurieren Sie den Speicher für eine Java-Anwendung

\n

Stellen wir uns vor, wir haben einen Webserver mit Spring Boot, der Benutzeranfragen verarbeitet. Ohne JVM-Einstellungen verwendet er die Standardwerte (abhängig von der Java-Version und dem verfügbaren RAM), was oft zu Problemen führt.

\n

Hier ist ein einfacher Code, der zeigt, wie Sie die aktuellen Heap-Parameter überprüfen können:

\n
public class MemoryCheck {\n    public static void main(String[] args) {\n        Runtime runtime = Runtime.getRuntime();\n        long maxMemory = runtime.maxMemory(); // -Xmx\n        long initialMemory = runtime.totalMemory(); // aktuelle Heap-Größe (kann nahe an -Xms sein)\n        long freeMemory = runtime.freeMemory();\n\n        System.out.println("Maximaler Speicher (-Xmx): " + maxMemory / (1024 * 1024) + " MB");\n        System.out.println("Aktuelle Heap-Größe: " + initialMemory / (1024 * 1024) + " MB");\n        System.out.println("Frei: " + freeMemory / (1024 * 1024) + " MB");\n    }\n}
\n

Starten Sie diesen Code ohne Flags – Sie sehen die Standardwerte. Fügen Sie nun die JVM-Argumente hinzu: -Xms256m -Xmx1g. Das Ergebnis ändert sich grundlegend: Der anfängliche Heap beträgt 256 MB, das Maximum 1 GB.

\n\n

Wie übergibt man die Parameter?

\n

Beim Start über die Kommandozeile:

\n
java -Xms256m -Xmx2g -jar myapp.jar
\n

In der Entwicklungsumgebung (IntelliJ IDEA, Eclipse) – in den Startkonfigurationseinstellungen. Für Docker-Container – über die Variable JAVA_OPTS.

\n\n

Leistungsoptimierung: So wählen Sie die richtigen Werte

\n

Die goldene Regel: -Xms sollte gleich -Xmx sein für Produktionsumgebungen. Warum? Dies verhindert Speicher„sprünge“ und unnötige Garbage-Collector-Aufrufe. Die JVM verschwendet keine Zeit mit der Heap-Erweiterung, sondern erhält sofort einen festen Umfang.

\n

Es gibt jedoch Nuancen:

\n