JVM参数之NativeMemoryTracking
Java8给HotSpot VM引入了Native Memory Tracking (NMT)特性,可以用于追踪JVM的内部内存使用,一般在压测调参的时候使用,生产环境不要引入。
参考资料:
https://www.jianshu.com/p/1e65d4d973cd
https://www.cnblogs.com/liululee/p/11143623.html
https://my.oschina.net/foxty/blog/1934968
1、启用:-XX:NativeMemoryTracking=detail:
-XX:NativeMemoryTracking=[off | summary | detail] # off: 默认关闭 # summary: 只统计各个分类的内存使用情况. # detail: Collect memory usage by individual call sites.
打开NMT会带来5%-10%的性能损耗
2、查看:
jcmd命令随时获取本机内存信息:
2.1、 jcmd <pid> VM.native_memory
2.2、jcmd <pid> VM.native_memory scale=MB
其中scale参数可以指定展示的单位,可以为KB或者MB或者GB
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
3、创建baseline:
3.1、 NMT允许我们跟踪内存分配如何随时间变化。首先,我们应该将应用程序的当前状态标记为基线:
jcmd <pid> VM.native_memory baseline
成功:Baseline succeeded
3.2、NMT使用+和 - 符号将告诉我们在此期间内存使用情况如何变化:
查看diff:然后,过了一会儿,我们可以将当前的内存使用情况与该基线(baseline)进行比较:
jcmd <pid> VM.native_memory summary.diff
示例:
Total: reserved=1771487KB +3373KB, committed=491491KB +6873KB
- Java Heap (reserved=307200KB, committed=307200KB)
(mmap: reserved=307200KB, committed=307200KB)
- Class (reserved=1084300KB +2103KB, committed=39356KB +2871KB)
// Truncated
保留和提交的总内存分别增加了3 MB和6 MB。可以很容易地发现内存分配的其他波动。