JVM Собственное отслеживание памяти, как ограничить размер метаданных класса - PullRequest
0 голосов
/ 18 июня 2019

Первоначальная проблема заключается в том, что приложение java является docker убитым OOM из-за использования памяти.Поэтому я начал использовать NMT, чтобы понять, почему потребление больше ожидаемого.Версия JVM - 1.8.0_212 с поддержкой контейнера.Докер запускается со следующими опциями Java

JAVA_OPTS='-XX:+AlwaysPreTouch -Xmx128m -Xms128m -XX:MaxMetaspaceSize=150m -XX:ReservedCodeCacheSize=100m -XX:+UseStringDeduplication -XX:+PrintFlagsFinal -XshowSettings:vm -XX:NativeMemoryTracking=detail' ... -m="450m" --cpu-shares="256" docker-image

Отслеживание собственной памяти:

Total: reserved=1464054KB +843KB, committed=344578KB +1359KB

...

-                     Class (reserved=1124594KB +19KB, committed=85066KB +275KB)
                            (classes #15631)
                            (malloc=2290KB +19KB #20081 +27)
                            (mmap: reserved=1122304KB, committed=82776KB +256KB)
...

Все числа соответствуют ожидаемым.Единственный вопрос для поля класса, так как оно показывает зарезервированное значение ~ 1 ГБ, может ли оно быть как-то уменьшено?

1 Ответ

1 голос
/ 18 июня 2019

Это Сжатое пространство классов .

Предел по умолчанию составляет ровно 1 ГБ, его можно уменьшить с помощью -XX:CompressedClassSpaceSize=N.

Область «Класс» в выходных данных отслеживания собственной памяти включает как Metaspace, так и Compressed Class Space, поэтому вы видите более 1 ГБ зарезервированных. Однако зарезервированная память - это всего лишь объем виртуального адресного пространства - она ​​не занимает страниц физической памяти.

Подробнее о Виртуальная память JVM

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