最近在测一个接口时,发现在并发压力的情况下,用jconsole监控JVM后,发现服务器灰常耗费内存导致GC频繁从而影响了性能,故想找到程序中具体哪块比较耗费内存。搜索一些资料后,终于找到了一个好用而界面直观的工具,能帮助我们很好的分析内存的耗费情况~
先说明一个linux下的命令 jps 和 jmap :
jps 用于 列出所有java相关线程的pid等信息,如:
[root@myjrjapp-100 ~]# jps
23178 Jps
20289 Bootstrap
其中,“20289 Bootstrap”是指系统中运行的tomcat进程号和进程名。
jmap 是一个可以输出所有内存中对象的工具,甚至可以将 VM 中的 heap ,以二进制输出成文本。 jmap -dump:format=b,file=f1 3024 可以将 3024 进程的内存 heap 输出出来到 f1 文件里。 它可以打印出某个 java 进程(使用 pid )内存内的,所有 ‘ 对象 ’ 的情况(如:产生那些对象,及其数量)
如: jmap pid 打印内存使用的摘要信息
分析方法1:
以上两个命令可以结合起来用,例如:
[root@myjrjapp-100 ~]# jps
23178 Jps
20289 Bootstrap
[root@myjrjapp-100 ~]# jmap 20289
Attaching to process ID 20289, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 10.0-b19
using thread-local object allocation.
Parallel GC with 8 thread(s)
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 1073741824 (1024.0MB)
NewSize = 1048576 (1.0MB)
MaxNewSize = 4294901760 (4095.9375MB)
OldSize = 4194304 (4.0MB)
NewRatio = 8
SurvivorRatio = 8
PermSize = 134217728 (128.0MB)
MaxPermSize = 268435456 (256.0MB)
Heap Usage:
PS Young Generation
Eden Space:
capacity = 118358016 (112.875MB)
used = 38070328 (36.30669403076172MB)
free = 80287688 (76.56830596923828MB)
32.165398919833194% used
From Space:
capacity = 458752 (0.4375MB)
used = 155664 (0.1484527587890625MB)
free = 303088 (0.2890472412109375MB)
33.932059151785715% used
To Space:
capacity = 458752 (0.4375MB)
used = 0 (0.0MB)
free = 458752 (0.4375MB)
0.0% used
PS Old Generation
capacity = 954466304 (910.25MB)
used = 72784624 (69.41282653808594MB)
free = 881681680 (840.8371734619141MB)
7.625688166776813% used
PS Perm Generation
capacity = 134217728 (128.0MB)
used = 38192248 (36.42296600341797MB)
free = 96025480 (91.57703399658203MB)
28.455442190170288% used
[root@myjrjapp-100 ~]#
分析方法2:
使用jmap命令dump内存出来 :
jmap -dump:live,format=b,file=heap.bin 8023
之后会在当前目录创建一个”heap.bin”文件,会有好几百M大小。可以把此文件进行压缩,然后再传到其他windows机器中进行结果分析。
[root@openAS-main ~]# gzip heap.bin
分析:
在测试机上安装一个分析工具:MemoryAnalyzer-Incubation-0.8.0.20100408-win32.win32.x86 这是Eclipse MAT,是SAP公司贡献的一个工具,可以在Eclipse网站下载到它,完全免费的。
分析截图:
从上面两个图中就能具体分析出是程序中的哪块耗费掉了大量的内存啦~