Проблема

Нагруженный сервис на 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 не используется.

Enter your comment. Wiki syntax is allowed:
 
  • devops/jvm_memory_limits_in_k8s.txt
  • Last modified: 2025/01/28 18:23
  • by admin