Использование памяти Kubernetes Pod не падает, когда JVM запускает сборку мусора - PullRequest
0 голосов
/ 20 января 2019

Я изо всех сил пытаюсь понять, почему мое Java-приложение медленно использует всю доступную для модуля память, в результате чего Kubernetes помечает модуль как нехватку памяти. JVM (OpenJDK 8) запускается со следующими аргументами:

-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=2

Я наблюдаю за памятью, используемой модулем, а также за памятью JVM, и ожидал увидеть некоторую корреляцию, например. после основной сборки мусора используемая память модуля также будет падать. Однако я не вижу этого. Я приложил несколько графиков ниже:

Под памятью: enter image description here Общая память JVM enter image description here Подробная разбивка JVM (извините за все цвета, выглядящие одинаково ... спасибо Кибана) enter image description here

С чем я борюсь, так это то, почему при значительном сокращении памяти кучи непосредственно перед 16:00 память стручков также не падает?

1 Ответ

0 голосов
/ 20 января 2019

Похоже, вы создаете модуль с ограничением ресурсов 1 ГБ памяти.Вы устанавливаете -XX:MaxRAMFraction=2, что означает, что вы выделяете 50% доступной памяти для JVM, которая, кажется, соответствует тому, что вы отображаете как Memory Limit.

JVM затем резервирует около 80% того, что выграфики в Memory Consumed.

Когда вы посмотрите на Memory Consumed, вы не увидите внутреннюю сборку мусора (как на втором графике), потому что память GC высвобождается обратно в JVM, но все еще зарезервирована им.

Возможно ли, что в вашем Java-приложении произошла утечка памяти?возможно, со временем будет зарезервировано больше памяти, пока не будет достигнут предел JVM (512 МБ) и ваш модуль не будет уничтожен OOM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...