Что такое использование MetaSpace в Java 8?
Я знаю, что они заменили PermGen на MetaSpace на Java 8. Но у меня есть несколько вопросов:
- По умолчанию MetaSpace собирает GC?
- Даже PermGen GC собран, добавив args как
-XX:+CMSClassUnloadingEnabled
, то что делает MetaSpace лучше, чем PermGen?
- MetaSpace основан на собственной памяти, поэтому он сохраняет java-объекты на дисках, а не на виртуальной машине?
- Даже у MetaSpace может закончиться нехватка памяти? Если так, я получу
OutOfMemoryException
.
- По умолчанию MetaSpace может увеличиваться при увеличении объема памяти?
Заранее спасибо
Ответы
Ответ 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 может закончиться нехватка памяти?
Да, он ограничен объемом памяти на вашем компьютере.