Разница между метапространством и собственной памятью в Java

В чем разница между Metaspace и родной памятью?

Метапространство можно отслеживать с помощью jconsole, jvisualvm, jstat cmds.
Кажется, Native Memory можно отслеживать с помощью jcmd. Ссылка

Является ли metaspace также родной памятью?

Где хранятся буферы NIO? В метапространстве или родной памяти?


person prem kumar    schedule 24.09.2016    source источник


Ответы (1)


Является ли метапространство также собственной памятью?

Да, Metaspace является частью собственной памяти (памяти процесса) и ограничен операционной системой хоста.

источник http://karunsubramanian.com/websphere/one-important-change-in-memory-management-in-java-8/ Вы можете отслеживать его с помощью jmap -permstat PID. Если ваше приложение в конечном итоге выделяет много памяти в метапространстве, это повлияет на всю систему, а не только на JVM. Вот почему рекомендуется использовать -XX:MetaspaceSize для явного задания максимального размера метапространства для вашего приложения.

API-интерфейсы Java NIO используют ByteBuffers в качестве источника и назначения вызовов ввода-вывода и бывают двух видов:

  • Heap Byte Buffer (оборачивает массив byte[], выделенный в куче Java, собранной мусором)
  • Прямой байтовый буфер (обтекание памяти, выделенной вне кучи Java)

Поскольку в вызовы операционной системы может быть передана только «собственная» память, поэтому она не будет перемещена сборщиком мусора, это означает, что когда вы используете кучный байтовый буфер для ввода-вывода, она копируется во временный прямой байтовый буфер. JDK кэширует один временный буфер на поток без каких-либо ограничений памяти (т. е. неограниченный кеш). В результате, если вы вызываете методы ввода/вывода с байтовыми буферами большой кучи из нескольких потоков, ваш процесс может использовать огромное количество дополнительной собственной памяти.

Вы можете обратиться к этому & эту статью для получения более подробной информации.

Обновлено

RSS=OffHeap (сопоставленные файлы, внутренний код JVM (сегменты .bss), стеки потоков, прямые буферы) + внутренняя структура GC+ куча + структуры, используемые и выделяемые собственными библиотеками (например, библиотеки ввода-вывода) + метапространство + Общие библиотеки JVM + CodeCache

Вы можете использовать в Linux pmap -x для анализа карты памяти вашего процесса JVM. Кроме того, Jemalloc может помочь записать профиль на диск после каждого x ГБ/x кБ выделения памяти/стека. трассировку, установив соответствующие переменные окружения MALLOC_CONF. Получив сгенерированный файл, попробуйте использовать
Jeprof для визуализации. . Например.

 jeprof --show_bytes --pdf `which w` jeprof.heap > sample.pdf

для создания PDF-файла для графиков вызовов.

person sol4me    schedule 24.09.2016
comment
Я использую Tomcat с поддержкой разъемов NIO. Значение RSS в ps unix cmd не соответствует (куча + метапространство). Итак, если собственная память больше, чем метапространство, как ее измерить. И, если возможно, вы могли бы упомянуть об использовании памяти (RSS) - person prem kumar; 24.09.2016
comment
Может быть много причин, таких как много потоков, может быть проблема с версией glibc › 2.10 и т. д. Вы можете использовать pmap - x, чтобы получить больше информации о памяти. - person sol4me; 24.09.2016
comment
@TheLostMind Я переформатировал свой пост, по какой-то причине форматирование не было применено должным образом в первый раз. Теперь все должно быть хорошо - person sol4me; 24.09.2016
comment
если метапространство является частью собственной памяти и его использование можно отслеживать, то как отслеживать общее использование собственной памяти? Я могу отслеживать кучу, метапространство. Но все же необходимо учитывать разницу в памяти RSS (резидентная память) - Heap -Metaspace . Эта разница для меня варьируется от 200 МБ до примерно 1 ГБ. - person prem kumar; 25.09.2016
comment
JVM также требуется память для внутренних компонентов .RSS=OffHeap (mapped files, JVM internal code (.bss segments), thread stacks, direct buffers) + GC internal structure+ Heap + Structures used & allocated by native libraries (e.g IO libraries) + Meatspace + Shared Libraries of the JVM + CodeCache . Вы пробовали pmap -x и анализировали вывод? Вы испытываете некоторые ошибки памяти? Вы также можете использовать Jemalloc для записи профиля на диск после каждого x ГБ/x кБ выделения памяти/трассировки стека, установив переменные env MALLOC_CONF и используя jeprof для визуализации сгенерированного файла. - person sol4me; 25.09.2016
comment
HotSpot (реализация JVM) также имеет нечто, называемое Native Memory Tracking, которое можно использовать для точного определения того, сколько памяти используется для различных внутренних структур данных. docs.oracle.com/javase/8/ docs/technotes/guides/vm/nmt-8.html - person Rickard; 05.10.2016
comment
Я знал о метапространстве, но до этого ответа никогда не слышал о мясном пространстве. Это место, где JVM выделяет память для стейка из трубки? - person neildo; 06.12.2017