Diese Frage habe ich mir immer gestellt, wenn ich an einer meiner Anwendungen gearbeitet habe, die eine große Anzahl von Threads pro Anfrage erzeugt.
Das ist also eine wirklich gute Frage, die zwei Aspekte hat:
1. Ob mein Xms- und Xmx-Wert gleich sein sollten
- Die meisten Websites und sogar die Oracle-Dokumente deuten darauf hin, dass es dasselbe ist. Ich schlage jedoch einen Puffer von 10-20% zwischen diesen Werten vor, um Ihrer Anwendung eine Option zur Größenanpassung des Heaps zu geben, falls es zu plötzlichen hohen Verkehrsspitzen ODER einem zufälligen Speicherleck kommt.
2. Ob ich meine Anwendung mit einer geringeren Heap-Größe beginnen sollte
- Die Sache ist also die: Egal, welchen GC Algo Sie verwenden (sogar G1), ein großer Heap hat immer einen gewissen Nachteil. Das Ziel ist es, das Verhalten Ihrer Anwendung zu identifizieren, welche Heap-Größe Sie Ihren GC-Pausen in Bezug auf Latenz und Durchsatz erlauben können.
- Wenn Ihre Anwendung zum Beispiel viele Threads hat (jeder Thread hat 1 MB Stack im Native Memory und nicht im Heap), aber keinen großen Objektspeicher belegt, dann schlage ich einen niedrigeren Wert für Xms vor.
- Wenn Ihre Anwendung viele Objekte mit einer zunehmenden Anzahl von Threads erzeugt, sollten Sie herausfinden, welchen Wert von Xms Sie festlegen können, um diese STW-Pausen zu tolerieren. Dies bedeutet, dass Sie die maximale Antwortzeit Ihrer eingehenden Anfragen ermitteln, die Sie tolerieren können, und die minimale Heap-Größe abstimmen.