Проблема
Нагруженный сервис на Java21 постоянно тыкается в лимит памяти.
Пляски с Xmx что-то не помогают.
Что же делать
- Чтобы JVM корректно определяла объем памяти, заданный с помощью k8s mem limit добавляем в опции:
-XX:+UseContainerSupport
- Чтобы не возиться с Xmx, а позволить JVM самостоятельно определить сколько надо - добавляем:
-XX:InitialRAMPercentage=50.0 -XX:MaxRAMPercentage=70.0
Максимальная цифра 70 - установлена и подтверждена экспериментально. https://stackoverflow.com/a/54076834 и https://stackoverflow.com/questions/65114573/java-memory-settings-in-a-docker-container
- В итоге Xmx вычислится сам по формуле
MaxHeapSize = MaxRAM * MaxRAMPercentage / 100% (default MaxRAMPercentage=25)
- Важно учитывать, что если задана Xmx, то MaxRAMPercentage не используется.
Discussion