引言:在Java应用中,对于内存的占用是一个让人头疼的问题,那在我们怀疑内存占用出现问题时,如何找到我们想要的答案,比如哪个占用了最多的内存,本文讲尝试给出一个思路。
1. 如何找到我们关心的进程?
Option 1: JPS
jps是JDK中自带的工具,帮助我们在系统中之间找到需要的java应用进程信息。
bladestone@bladestone-laptop:~$ jps
3143 WxDemoApplication
4043 Jps
32446 org.eclipse.equinox.launcher_1.3.200.v20160318-1642.jar
Option 2: ps -ef | grep java
bladestone@bladestone-laptop:~$ ps -ef | grep java
bladest+ 5355 5352 0 22:15 pts/1 00:00:00 /usr/bin/java -Dosgi.requiredJavaVersion=1.8 -Xms40m -Xverify:none -Xmx1200m -jar /opt/sts-bundle/sts-3.8.1.RELEASE//plugins/org.eclipse.equinox.launcher_1.3.200.v20160318-1642.jar -os linux -ws gtk -arch x86_64 -showsplash -launcher /opt/sts-bundle/sts-3.8.1.RELEASE/STS -name STS --launcher.library /opt/sts-bundle/sts-3.8.1.RELEASE//plugins/org.eclipse.equinox.launcher.gtk.linux.x86_64_1.1.400.v20160518-1444/eclipse_1617.so -startup /opt/sts-bundle/sts-3.8.1.RELEASE//plugins/org.eclipse.equinox.launcher_1.3.200.v20160318-1642.jar --launcher.overrideVmargs -exitdata 208008 -product org.springsource.sts.ide -vm /usr/bin/java -vmargs -Dosgi.requiredJavaVersion=1.8 -Xms40m -Xverify:none -Xmx1200m -jar /opt/sts-bundle/sts-3.8.1.RELEASE//plugins/org.eclipse.equinox.launcher_1.3.200.v20160318-1642.jar
bladest+ 5362 4911 0 22:15 pts/1 00:00:00 grep --color=auto java
2. 如何获取内存结构或者内存镜像文件?
在本地的测试环境下,我们可以基于pid来进行远程调用,直接在工具中MAT或者visualvm中直接进行调试。但是在生产环境上或者远程的服务器上,该如何来获取java应用的内存镜像?
基于jmap来获取内存镜像,jmat是由jdk自带的命令行工具。
>> jmap -dump:live,file=wx.dump 3143
bladestone@bladestone-laptop:~$ jmap -dump:live,file=wx.dump 3143
Dumping heap to /home/bladestone/wx.dump ...
Heap dump file created
3. JMAP命令
jmap是Java Memory Map的缩写,打印出某个java进程(使用pid)内存内的,所有‘对象’的情况(如:产生那些对象,及其数量),可以输出所有内存中对象的工具,甚至可以将VM 中的heap,以二进制输出成文本。
使用方法 jmap -histo pid。如果使用命令行 jmap -histo pid>a.log可以将其保存到文本中去,在一段时间后,使用文本对比工具,可以对比出GC回收了哪些对象。jmap -dump:format=b,file=outfile 3024可以将3024进程的内存heap输出出来到outfile文件里。
参考资料:http://blog.csdn.net/fenglibing/article/details/6411953
Offical Reference: https://docs.oracle.com/javase/7/docs/technotes/tools/share/jmap.html
4. 基于MAT进行内存镜像分析
安装MAT,基于Eclipse的Market来进行安装:
进行内存镜像分析;在安装好MAT之后,首先切换至MAT的perspective视图。
打开菜单“文件”,点击Open Dump File,选中前一步骤的dump文件,导入MAT. 进行分析,即可得到如下图示:
关于MAT的使用说明,可以参考如下资料:
http://www.blogjava.net/rosen/archive/2010/06/13/323522.html
5.总结
除了MAT之外,还可以使用visualvm来进行内存镜像分析。目前在JDK中已经内置了jvisualvm,其实他们是同一个版本的软件。