2016-12-08 5 views
3

Я новичок в этой теме, так что извиняюсь, если мой вопрос очевиден, но вот он -
Всякий раз, когда мы запускаем Java-приложение, создается новый экземпляр JVM. Сам JVM - это процесс, который работает на ОС и, как и любой другой процесс, имеет собственные требования к памяти.
Я знаю структуру памяти кучи и не кучи, а также их настройку и управление. То, что я ищу, это детали памяти самого процесса jvm, Как разделяется общая память i.e собственные требования к памяти jvm + куча + не-куча + собственный стек
Сколько сегментов есть?
Сколько памяти OS выделяет JVM и как jvm использует ее дальше?
Есть ли какая-либо команда или утилита для проверки этих сведений во время запуска приложения?
Я много искал в googled, но не нашел ничего конкретного в этом направлении, почти везде статьи объясняют структуру памяти кучи и не кучи (eden/old/meta и т. Д.). Я также посетил ниже Ссылки-
JVM Memory Types
How is the java memory pool divided?
JVM Memory segments allocation
https://blog.codecentric.de/en/2010/01/the-java-memory-architecture-1-act/
JVM memory mapping over a Linux Process
Understanding JVM Memory Allocation and Java Out of Memory: Heap Space
Кажется, я застрял здесь, любой указатель на эту тему было бы здорово, так что я могу начать поиск в этом направлении.Сведения о памяти JVM как процесса

ответ

3

Функция отслеживания основной памяти (NMT) Java 8 помогает ответить на ваши вопросы.

Run Java с опцией -XX:NativeMemoryTracking=summary
Затем во время выполнения выполнить следующую команду для печати статистики памяти виртуальной машины Java:

jcmd <pid> VM.native_memory summary 

Результат будет выглядеть так:

Total: reserved=664192KB, committed=253120KB 

-     Java Heap (reserved=516096KB, committed=204800KB) 
          (mmap: reserved=516096KB, committed=204800KB) 

-      Class (reserved=6568KB, committed=4140KB) 
          (classes #665) 
          (malloc=424KB, #1000) 
          (mmap: reserved=6144KB, committed=3716KB) 

-     Thread (reserved=6868KB, committed=6868KB) 
          (thread #15) 
          (stack: reserved=6780KB, committed=6780KB) 
          (malloc=27KB, #66) 
          (arena=61KB, #30) 

-      Code (reserved=102414KB, committed=6314KB) 
          (malloc=2574KB, #74316) 
          (mmap: reserved=99840KB, committed=3740KB) 

-      GC (reserved=26154KB, committed=24938KB) 
          (malloc=486KB, #110) 
          (mmap: reserved=25668KB, committed=24452KB) 

-     Compiler (reserved=106KB, committed=106KB) 
          (malloc=7KB, #90) 
          (arena=99KB, #3) 

-     Internal (reserved=586KB, committed=554KB) 
          (malloc=554KB, #1677) 
          (mmap: reserved=32KB, committed=0KB) 

-     Symbol (reserved=906KB, committed=906KB) 
          (malloc=514KB, #2736) 
          (arena=392KB, #1) 

-   Memory Tracking (reserved=3184KB, committed=3184KB) 
          (malloc=3184KB, #300) 

-  Pooled Free Chunks (reserved=1276KB, committed=1276KB) 
          (malloc=1276KB) 

-     Unknown (reserved=33KB, committed=33KB) 
          (arena=33KB, #1) 

Больше информации here и here.

+0

Именно то, что я искал. – meexplorer

1

Если вы ищете утилиты командной строки, начинайте с jps, который просто печатает PID всех запущенных java-процессов. Затем выберите тот, который вы хотите открыть, и используйте jmap с его PID.

JDK приходит с визуальными инструментами также. Старый JConsoke и новый и лучший VisualVM.

+0

Я использовал Jconsole и Visual VM. Только что нашел эту статью, я смотрю что-то вроде этого, http://blogs.vmware.com/apps/2011/06/taking-a-closer-look-at-sizing-the-java-process.html – meexplorer

+1

Если OS выделяет X-память для JVM в качестве процесса, а затем из X, JVM выделяет память на кучу/perm на основе -Xms/-Xmx/-XX: PermSize, MaxPermSize, скажем, в оставшейся памяти (X1 = X-heap- завивка). Теперь, что происходит с X1, сколько памяти требуется JVM для себя из X1, сколько идет в другие сегменты? как объясняет статья, есть и другие сегменты. – meexplorer

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