说明
java8给HotSpot VM引入了Native Memory Tracking (NMT)特性,可以用于追踪JVM内部的内存使用情况
使用
开启
1 | -XX:NativeMemoryTracking=summary |
使用-XX:NativeMemoryTracking=summary可以用于开启NMT,其中该值默认为off,可以设置为summary或者detail来开启;开启的话,大概会增加5%-10%的性能消耗
查看
1 |
使用jcmd pid VM.native_memory可以查看,后面可以加summary或者detail,如果是开启summary的,就只能使用summary;其中scale参数可以指定展示的单位,可以为KB或者MB或者GB
创建baseline
1 | # jcmd 1 VM.native_memory baseline |
创建baseline之后可以用summary.diff或者detail.diff来对比
查看diff
1 | # jcmd 1 VM.native_memory summary.diff |
使用summary.diff来查看跟baseline对比的统计信息
shutdown时输出
1 | -XX:+UnlockDiagnosticVMOptions -XX:+PrintNMTStatistics |
使用上述命令可以在jvm shutdown的时候输出整体的native memory统计
关闭
1 | # jcmd 1 VM.native_memory shutdown |
使用jcmd pid VM.native_memory shutdown可以用于关闭NMT;注意使用jcmd关闭之后貌似没有对应jcmd命令来开启
实例1
1 | # jcmd 1 VM.native_memory summary scale=MB |
其中reserved
是指总共可用的内存大小, 而commited
是指已经使用的内存大小
Java Heap
为堆内情况,Class
为元数据区已加载的类信息,Thread
为当前线程情况,包括程序主线程、Cleaner线程,也包括 GC 等本地线程,Code
为codecach相关内容,也就是 JIT compiler 存储编译热点方法等信息的地方,GC
为垃圾回收采相关内容,例如G1中的Remembered Set等数据结构占用的就是这里的空间,Internal
统计信息包含着Direct Buffer 的直接内存,Native Memory Tracking
部分表示该功能自身占用的部分。
实例2
1 | # jcmd 1 VM.native_memory summary.diff scale=MB |
通过summary.diff
命令可以看到两次jcmd之间的变化,每个部分的增减都通过+/-
标识了出来。