2016-11-30 3 views
10

В Java 8 кучной распечатке, вы можете увидеть строку, которая выглядит как:Понимания Метапространства линии в JVM кучи распечатке

Метапространство используется 2425K, способности 4498K, совершил 4864K, защищены 1056768K

https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/considerations.html пытается объяснить строку:

В строке, начинающейся с Metaspace, значение - это объем пространства, используемого для загруженных классов. Значение - это пространство, доступное для метаданных в выделенных в настоящее время кусках. Значение - это объем свободного места для кусков. Значение зарезервировано - это объем зарезервированного места (но не обязательно совершенный) для метаданных.

Опять же, из приведенной выше ссылке:

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

Я хочу знать, что означает каждое поле (используется, емкость, совершено, зарезервировано), но я изо всех сил стараюсь понять приведенные выше определения.

Я понимаю, что метапространство вырезано из виртуального адресного пространства процесса JVM. JVM резервирует начальный размер при запуске на основе -XX: MetaspaceSize, который имеет недокументированные значения по умолчанию для платформы. Я предполагаю, что зарезервировано относится к общему размеру метассы. Пространство делится на куски. Я не уверен, что каждый кусок имеет одинаковый размер. Каждый кусок содержит метаданные класса, связанные с загрузчиком одного класса.

Вместимость и совершили звучит как свободное пространство для меня (на основе определений из ссылки). Поскольку метаданные хранятся в кусках, я бы предположил, что используемая + емкость была бы равной, но это не так. Может быть, совершенное означает зарезервированное пространство, которое используется, но тогда то, что могло бы означать? Используемое пространство, используемое метаданными? Затем, какие еще способы использовать пространство?

Надеюсь, вы увидите мое замешательство. Я был бы признателен за разъяснения в отношении определений.

ответ

23

Metaspace layout

Метапространство состоит из одного или нескольких виртуальных пространств. Виртуальные пространства - это области смежного адресного пространства, полученные из ОС. Они распределяются по требованию. При распределении виртуальное пространство резервирует память от ОС, но еще не совершает. Metaspace зарезервировано память - это общий размер всех виртуальных пространств.

Блок распределения внутри виртуального пространства является метафоном (или просто фрагментом).Когда новый кусок выделяется из виртуального пространства, соответствующая память равна , совершенной. Metaspace совершил память - это общий размер всех кусков.

Цанки могут отличаться по размеру. Когда ClassLoader получает собранный мусор, все принадлежащие ему Metachunks освобождаются. Свободные куски поддерживаются в глобальном свободном списке. Metaspace Вместимость - это общий размер всех выделенных (т. Е. Не бесплатно) кусков.

Новое распределение ломоть

  1. Посмотрите на существующий свободный кусок в свободном списке.
  2. Если нет подходящего свободного фрагмента, выделите новый из текущего виртуального пространства.
  3. Если текущее виртуальное пространство исчерпано, зарезервируйте новое виртуальное пространство.

Метаданные класса выделяются внутри куска. Chunk может не содержать данные от нескольких ClassLoaders, но один ClassLoader может иметь несколько фрагментов. Metaspace - общий размер всех метаданных класса из всех кусков.

+1

Спасибо, это отличный ответ и очищает мое замешательство! Наличие картинки, иллюстрирующей ваш текст, было приятным прикосновением. –

Смежные вопросы