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

原创 2016年09月18日 23:00:42

引言:在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,其实他们是同一个版本的软件。

 





相关文章推荐

性能分析之-- JAVA Thread Dump 分析综述

最近在做性能测试,需要对线程堆栈进行分析,在网上收集了一些资料,学习完后,将相关知识整理在一起,输出文章如下。 一、Thread Dump介绍 1.1什么是Thread Dump? Th...

使用jstack和TDA进行java线程dump分析

直接查看jstack的输出文件分析,看起来可能看起来比较麻烦,尤其在线程多的情况下,使用TDA等工具可以降低分析的工作量。...

java Heap Dump基本概念及如何获取

1.Heap Dump 如果你不知道Java里面的Heap是什么意思,这篇文章可能就不太适合你阅读了。 一个Heap Dump是指在某个时刻对一个Java进程所使用的内存情况的一次快照。也...

jmap命令(Java Memory Map)

JDK内置工具使用 一、javah命令(C Header and Stub File Generator) 二、jps命令(Java Virtual Machine Process Status To...

JVM性能调优之生成堆的dump文件

最近因项目存在内存泄漏,故进行大规模的JVM性能调优 , 现把经验做一记录。 一、JVM内存模型及垃圾收集算法  1.根据Java虚拟机规范,JVM将内存划分为: New(年轻代)T...

使用jmap dump 分析JVM内存状态

查看整个JVM内存状态 jmap -heap [pid] 要注意的是在使用CMS GC 情况下,jmap -heap的执行有可能会导致Java 进程挂起...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

如何分析jvm dump 内存日志

如何dump出jvm日志。 1. 在jvm启动的参数中,新增 jvm参数。这样在发生jvm 内存溢出时,就会直接dump出java.hprof 文件了。...

内存Dump原理

windows中一个可执行性程序被执行后,或者其他的数据文件,只要被影射到了某个进程的地址空间就有机会将它dump出来,这种技术到底有何用,举个例子,比如你有一个软件,并且设置了注册机制,而且用过特殊...
  • adebies
  • adebies
  • 2013年02月24日 01:22
  • 4465

android dump内存办法大全

1.ida运行脚本 autoi,fp,begin,end; fp=fopen("D:\\xx.so","wb"); begin=0xAC338000; end=0xAC393000; for...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何Dump当前Java应用的内存结构,并进行分析找到占用空间最大的Class
举报原因:
原因补充:

(最多只允许输入30个字)