Поведение памяти JDK12 в контейнере docker - PullRequest
2 голосов
/ 16 января 2020

Насколько я понял, начиная с JDK12 старый экспериментальный флаг -XX:+UseCGroupMemoryLimitForHeap был удален, но будет базовым, например, все приложения JDK12 будут считывать память cgroup и устанавливать по умолчанию внутренние значения -Xms и -Xmx. Однако, когда я запустил -XX:+PrintFlagsFinal без указания -Xmx, это показало, что у меня было только 512 МБ памяти для MaxHeap в контейнере с ограничением в 2 ГБ выделенной памяти.

Я что-то пропустил, и сообщество решило убрать флаг -XX:+UseCGroupMemoryLimitForHeap без намерения поддерживать поведение?

1 Ответ

3 голосов
/ 16 января 2020

Это правильно. Java 12 учитывает ограничение ОЗУ cgroup (2 ГБ) и игнорирует общий объем ОЗУ, доступный на хосте (который превышает 2 ГБ). Поскольку -Xmx не был указан, по умолчанию JVM использует 25% доступной оперативной памяти, и в итоге получается 512 МБ кучи. На практике -Xmx - это заданное c значение, которое переопределяет -XX:+UseCGroupMemoryLimitForHeap и другие флаги, определяющие динамическую c размер кучи.

Предполагая, что вы не хотите указывать -Xmx напрямую, скорее всего, вы хотите использовать -XX:MaxRAMFraction=1, что заставит JVM использовать 100% доступной оперативной памяти. Обратите внимание, что под нагрузкой может убить контейнер .

...