2016-09-24 1 views
3

В чем разница между Metaspace и Родомна?Разница между Metaspace и Native Memory в Java

Metaspace можно отследить с помощью jconsole, jvisualvm, jstat cmds.
Кажется, что Native Memory можно отследить с помощью jcmd. Link

Is metaspace также родной памяти?

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

ответ

11

Is metaspace также родной памяти?

Да, Метапространство является частью (памяти процесса) Native памяти и ограничивается операционной системой

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

Java NIO API, использовать ByteBuffers в качестве источника и назначения/вывода вызовов I, и в двух вариантах:

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

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

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

Обновленных

RSS = OffHeap (отображенные файлы, JVM, внутренний код (.bss сегменты), стеки потоков, прямые буфера) + АЯ внутренняя структура + ворох + Структура, используемая & выделенная нативными библиотеки (е.g IO) + Metaspace + Общие библиотеки JVM + CodeCache

Вы можете использовать на linux pmap -x для анализа карты памяти вашего JVM-процесса. Кроме того, Jemalloc может помочь записать профиль на диск после каждого x GB/x kB выделения памяти/стека, установив соответствующий MALLOC_CONF env variables. Если у вас есть сгенерированный файл, попробуйте использовать
Jeprof для visualisation. Например.

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

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

+0

Я использую Tomcat с разъемами NIO. Значение RSS в 'ps' unix cmd не соответствует (heap + metaspace). Поэтому, если родная память больше, чем metaspace, как ее измерить. И если возможно, вы могли бы упомянуть о разрыве используемой памяти (RSS) –

+1

Могут быть много причин, как для многих потоков, может быть проблема с версией glibc> 2.10 и т. Д. Вы можете использовать 'pmap-x', чтобы получить больше информации в память. – sol4me

+2

Большая часть вашего ответа была скопирована с http://www.evanjones.ca/java-bytebuffer-leak.html – TheLostMind

Смежные вопросы