Metaspace - это область памяти для хранения метаданных класса - внутренние структуры JVM, созданные при синтаксическом анализе .class
файлов.
Метаданные класса включают в себя:
- Внутреннее представление классов Java
- Методы с их байт-кодом
- дескрипторы полей
- Постоянные пулы
- Символы
- Аннотации
- и т.д.
-XX:MaxMetaspaceSize
по умолчанию не ограничено.
Когда опция -XX:+UseCompressedClassPointers
включена (по умолчанию для куч <32G), классы перемещаются из Metaspace в отдельную область, называемую <strong>Compressed Class Space . Это позволяет разрешить адресацию структур классов VM с помощью 32-битных значений вместо 64-битных.
Итак, Compressed Class Space содержит внутреннее представление классов Java, в то время как Metaspace содержит все остальные метаданные: методы, пулы констант, аннотации и т. Д.
Размер сжатого пространства классов ограничен -XX:CompressedClassSpaceSize
, который по умолчанию равен 1G. Максимально возможное значение -XX:CompressedClassSpaceSize
- 3G.
Неклассовое Metaspace и Compressed Class Space являются двумя непересекающимися областями. MaxMetaspaceSize
ограничивает фиксированный размер обеих областей:
committed(Non-class Metaspace) + committed(Compressed Class Space) <= MaxMetaspaceSize
Если значение MaxMetaspaceSize
меньше CompressedClassSpaceSize
, последнее автоматически уменьшается до
CompressedClassSpaceSize = MaxMetaspaceSize - 2*InitialBootClassLoaderMetaspaceSize