Почему размер MetaSpace в два раза больше, чем у MetaSpace?

Я написал программу для симуляции MetaSpace OOM. Но я обнаружил, что MetaSpace Size почти всегда вдвое больше, чем Used MetaSpace, Зачем?

Я запускаю свою программу с флагом -XX:MaxMetaspaceSize=50mпрограмма бросит ООМ, когда Used MetaSpace достиг около 25 млн., а не 50 млн. Почему?

2 ответа

Решение

Я думаю, что следующие два эксперимента объяснят, что означает разрыв между MetaSpace Size и Used MetaSpace:

EXP-1: загрузить один класс на ClassLoader, я получил это:

EXP-2: загрузить пять классов на ClassLoader, я получил это:

Как сказано в документе Java 8:

Пространство запрашивается у ОС и затем разделяется на куски. Загрузчик классов выделяет пространство для метаданных из своих чанков (чанк привязан к определенному загрузчику классов).

Я думаю, это означает, что чанк может содержать более одного класса, поэтому коэффициент использования MetaSpace Size увеличивается по мере загрузки большего количества классов на ClassLoader.

Вы можете снова увидеть результаты, запустив здесь код с помощью команды:

java -XX:MaxMetaspaceSize=50m MetadataOOMSimulator 100000000

Внимание: убедитесь, что все загружаемые классы не отображаются в CLASSPATH (обычно включает в себя текущий каталог), или эти классы будут загружены APPClassLoader, а не настроенным ClassLoader.

Хороший вопрос;-)

Посмотрите на эту довольно хорошую статью.

PermGenSpace против MetaSpace

Другие вопросы по тегам