如何Dump当前Java应用的内存结构,并进行分析找到占用空间最大的Class

引言:在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来进行安装:

 如何Dump当前Java应用的内存结构,并进行分析找到占用空间最大的Class_第1张图片

 进行内存镜像分析;在安装好MAT之后,首先切换至MAT的perspective视图。

 如何Dump当前Java应用的内存结构,并进行分析找到占用空间最大的Class_第2张图片

打开菜单“文件”,点击Open Dump File,选中前一步骤的dump文件,导入MAT. 进行分析,即可得到如下图示:

 如何Dump当前Java应用的内存结构,并进行分析找到占用空间最大的Class_第3张图片

 关于MAT的使用说明,可以参考如下资料:

 http://www.blogjava.net/rosen/archive/2010/06/13/323522.html

5.总结

 除了MAT之外,还可以使用visualvm来进行内存镜像分析。目前在JDK中已经内置了jvisualvm,其实他们是同一个版本的软件。

 





你可能感兴趣的:(Java技术)