Понимание линии metaspace в распечатке кучи JVM

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

Metaspace используется 2425K, емкость 4498K, зафиксировано 4864K, зарезервировано 1056768K

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

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

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

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

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

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

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

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

Ответ 1

Раскладка метаданных

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

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

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

Новое распределение блоков

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

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