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。可以很容易地发现内存分配的其他波动。

 

posted @ 2020-09-17 20:37  晓等  阅读(5498)  评论(0编辑  收藏  举报