目录

 

一、Native Memory Tracking (NMT)

    是Hotspot VM用来分析VM内部内存使用情况的一个功能。我们可以利用jcmd(jdk自带)这个工具来访问NMT的数据。

1.Native memory tracking is not enabled 打开NMT

二、查看原生内存信息:jcmd process_id VM.native_memory summary

1.打基线


2.查看detail

3.使用summary.diff来查看跟baseline对比的统计信息

4.jcmd查看NMT报告

5.NMT报告分析

总结:


一、Native Memory Tracking (NMT)

1.Native memory tracking is not enabled 打开NMT

NMT必须先通过VM启动参数中打开,不过要注意的是,打开NMT会带来5%-10%的性能损耗。

-XX:NativeMemoryTracking=[off | summary | detail]

 


# off: 默认关闭

 


# summary: 只统计各个分类的内存使用情况.

 


# detail: Collect memory usage by individual call sites.

 


例如:-XX:NativeMemoryTracking=detail

二、查看原生内存信息:jcmd process_id VM.native_memory summary

jcmd <pid> VM.native_memory  [summary | detail | baseline | summary.diff | detail.diff | shutdown] 

1.打基线

jcmd 1 VM.native_memory baseline

2.查看detail

jcmd <pid>  VM.native_memory detail  scale=MB

 


jcmd <pid>  VM.native_memory detail

[转帖]JVM NativeMemoryTracking ;jcmd process_id VM.native_memory;Native memory tracking is not enabled_基线

[转帖]JVM NativeMemoryTracking ;jcmd process_id VM.native_memory;Native memory tracking is not enabled_Java_02

 

3.使用summary.diff来查看跟baseline对比的统计信息

 

jcmd <pid> VM.native_memory summary.diff

[转帖]JVM NativeMemoryTracking ;jcmd process_id VM.native_memory;Native memory tracking is not enabled_Java_03

 

4.jcmd查看NMT报告

jcmd <pid> VM.native_memory [summary | detail | baseline | summary.diff | detail.diff | shutdown] [scale= KB | MB | GB]

 


 

 


# summary: 分类内存使用情况.

 


# detail: 详细内存使用情况,除了summary信息之外还包含了虚拟内存使用情况。

 


# baseline: 创建内存使用快照,方便和后面做对比

 


# summary.diff: 和上一次baseline的summary对比

 


# detail.diff: 和上一次baseline的detail对比

 


# shutdown: 关闭NMT



5.NMT报告分析

reserved表示应用可用的内存大小,
committed表示应用正在使用的内存大小

Total: reserved=1927465KB +66KB, committed=887589KB +66KB

-                 Java Heap (reserved=1048576KB, committed=524288KB)
                            (mmap: reserved=1048576KB, committed=524288KB)
 
-                     Class (reserved=387186KB, committed=89842KB)
                            (classes #15588) 已经加载的classes个数
                            (malloc=2162KB #23499)
                            (mmap: reserved=385024KB, committed=87680KB)
               
-                    Thread (reserved=46014KB, committed=46014KB)   
                            (thread #85)   Thread部分表示线程个数
                            (stack: reserved=45648KB, committed=45648KB)
                            (malloc=267KB #448)
                            (arena=98KB #165)
 
-                      Code (reserved=256433KB, committed=39725KB)  表示JIT生成的或者缓存的instructions占用
                            (malloc=6833KB #9122)
                            (mmap: reserved=249600KB, committed=32892KB)
 
-                        GC (reserved=49673KB, committed=48137KB)  目前已经占用的内存空间用于帮助GC
                            (malloc=46593KB #362)
                            (mmap: reserved=3080KB, committed=1544KB)
 
-                  Compiler (reserved=309KB, committed=309KB)
                            (malloc=178KB #1157)
                            (arena=131KB #6)
 
-                  Internal (reserved=71623KB +1KB, committed=71623KB +1KB) 表示命令行解析、JVMTI等占用
                            (malloc=71591KB +1KB #19791 +4)
                            (mmap: reserved=32KB, committed=32KB)
 
-                    Symbol (reserved=22144KB, committed=22144KB)  表示诸如string table及constant pool等symbol占用
                            (malloc=18492KB #182273)
                            (arena=3652KB #1)
 
-    Native Memory Tracking (reserved=4222KB +66KB, committed=4222KB +66KB)  表示该功能自身占用
                            (malloc=425KB +54KB #6037 +760)
                            (tracking overhead=3797KB +12KB)
 
-               Arena Chunk (reserved=189KB, committed=189KB) 表示arena chunk占用
                            (malloc=189KB)
 
-                   Unknown (reserved=41096KB, committed=41096KB)
                            (mmap: reserved=41096KB, committed=41096KB)

 

总结:

 

java8给HotSpot VM引入了Native Memory Tracking (NMT)特性,可以用于追踪JVM的内部内存使用

 


 

 


使用-XX:NativeMemoryTracking=summary可以用于开启NMT,其中该值默认为off,

 


可以设置summary、detail来开启;开启的话,大概会增加5%-10%的性能消耗;使用-XX:+UnlockDiagnosticVMOptions -XX:+PrintNMTStatistics

 


可以在jvm shutdown的时候输出整体的native memory统计;

 


其他的可以使用jcmd pid VM.native_memory相关命令进行查看、diff、shutdown等

 


 

 


整个memory主要包含了Java Heap、Class、Thread、Code、GC、Compiler、Internal、Other、Symbol、Native Memory Tracking、Arena Chunk这几部分;其中reserved表示应用可用的内存大小,committed表示应用正在使用的内存大小