Подтвердить что ты не робот

Что такое использование MetaSpace в Java 8?

Я знаю, что они заменили PermGen на MetaSpace на Java 8. Но у меня есть несколько вопросов:

  • По умолчанию MetaSpace собирает GC?
  • Даже PermGen GC собран, добавив args как -XX:+CMSClassUnloadingEnabled, то что делает MetaSpace лучше, чем PermGen?
  • MetaSpace основан на собственной памяти, поэтому он сохраняет java-объекты на дисках, а не на виртуальной машине?
  • Даже у MetaSpace может закончиться нехватка памяти? Если так, я получу OutOfMemoryException.
  • По умолчанию MetaSpace может увеличиваться при увеличении объема памяти?

Заранее спасибо

4b9b3361

Ответ 1

MetaSpace по умолчанию собирается GC?

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

Даже PermGen собирается GC путем добавления аргументов, таких как -XX: + CMSClassUnloadingEnabled, тогда что делает MetaSpace лучше, чем PermGen?

Улучшение связано с динамическим расширением метапространства, чего не мог сделать permgen.

MetaSpace основан на собственной памяти, поэтому он хранит объекты Java на дисках, а не на виртуальной машине?

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

Основываясь на исследовании Пьера-Хьюга Шарбонно (ссылка здесь), стало ясно, что введение метапространства не обязательно решает проблему ООМ, в лучшем случае оно решает проблему, оно пытается динамически изменить размер памяти метаскопа, чтобы вместить растущее число классов, которые загружаются с возможным побочным эффектом неконтролируемого роста (до тех пор, пока это позволяет собственная память).

Мы можем добиться известной ошибки OOM, установив аргумент MaxMetaspaceSize в JVM и запустив предоставленный пример программы.

Огромное спасибо Пьеру Хью Шарбонно.

Ответ 2

В ответ:

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

  • MetaSpece использует встроенную память, а организация в памяти с указателями делает GC более быстрой, чем более ранняя память PermGen.

  • Нет, это означает, что JVM использует память как обычную программу C и не использует пространство виртуальной памяти для java-объектов. Кажется, что память ограничена только машиной. Позаботьтесь о том, чтобы память машины могла быть заменена на диск при необходимости.

  • Если вы установите параметр MaxMetaspaceSize, вы можете получить OutOfMemory и, если вы не установите этот параметр, вы можете получить, если процесс распределяет всю память устройства (включая пространство подкачки).

Ответ 3

  • По умолчанию MetaSpace собирает GC?

    Сбор мусора мертвых классов и загрузчиков классов запускается после того, как использование метаданных класса достигает "MaxMetaspaceSize", которое по умолчанию равно "unlimited", поэтому для ограничения задержки или частоты такого GC требуется надлежащий мониторинг.

  • Даже PermGen GC собран, добавив args как -XX: + CMSClassUnloadingEnabled, то что делает MetaSpace лучше, чем PermGen?

    Основная цель заключается в том, что удаление пергмена было таким, чтобы пользователям не приходилось думать о правильной его калибровке.

  • MetaSpace основан на собственной памяти, поэтому он сохраняет java-объекты на дисках, а не на виртуальной машине?

    Диск не является собственной памятью, а запоминающим устройством. Собственная память, в этом контексте является областью, является памятью для процесса, оставшегося от кучи Java

  • Даже у MetaSpace может закончиться нехватка памяти?

    Да, он ограничен объемом памяти на вашем компьютере.