1、查看java进程
(1)ps -aux | grep 服务名
得到进程pid是24417,同时能看到设置的最大堆内存是100M
2、查看进程占用总内存
(1)top(可按shift+M按内存排序)
可以算出整个java进程大约占用360M,发现一个问题,总内存远大于堆内存的100M上限
3、使用jstat查看jvm内部的内存情况
(1)jstat -gc 24417
S0C+S1C+EC+OC+MC=157M
发现堆内存加上元空间的内存还是少于360M
4、使用Native Memory Tracking继续剖析
(1)默认情况下,NMT是处于关闭状态的,我们可以通过设置 JVM 启动参数来开启:
-XX:NativeMemoryTracking=[off | summary | detail]
(2)执行jcmd 24417 VM.native_memory scale=MB
发现展示的内存占用更多了,总占用的335M和第二步中的360M已经很接近,而第三步的157M约等于java heap和class之和,除此之外主要还包含thread的内存,上图中#143表示线程数,默认一个线程1M(图中的线程占用被修改成了228K)