如何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...
  • rachel_luo
  • rachel_luo
  • 2013年05月13日 14:43
  • 57517

JAVA dump查看线程运行情况

JAVA dump查看线程运行情况: 查询java程序pid(两种方案,二选一)1)直接输入项目名称回车(适用于可以通过如“tt”命令查看到部署的项目名称) 2)使用jps [-l]命令查看本机所有...
  • u010271462
  • u010271462
  • 2017年04月14日 13:50
  • 1414

JAVA-DUMP

对于大型 java 应用程序来说, 再精细的测试都难以堵住所有的漏洞,即便我们在测试阶段进行了大量卓有成效的工作, 很多问题还是会在生产环境下暴露出来,并且很难在测试环境中进行重现。 JVM 能...
  • jiubugeinifo
  • jiubugeinifo
  • 2014年12月17日 15:47
  • 655

java 获取内存dump 的几种方式

1、获取内存详情:jmap -dump:format=b,file=e.bin pid 这种方式可以用 jvisualvm.exe 进行内存分析,或者采用 Eclipse Memory Anal...
  • niyuelin1990
  • niyuelin1990
  • 2017年09月19日 19:19
  • 146

从java进程里dump出类的class文件的小工具--dumpclass

Serviceability Agent想要查看一些被增强过的类的字节码,或者一些AOP框架的生成类,就需要dump出运行时的java进程里的字节码。从运行的java进程里dump出运行中的类的cla...
  • hengyunabc
  • hengyunabc
  • 2016年04月09日 19:50
  • 3640

Java Heap dump文件分析工具jhat简介

jhat 是Java堆分析工具(Java heap Analyzes Tool). 在JDK6u7之后成为标配. 使用该命令需要有一定的Java开发经验. jhat 命令解析Java堆转储文件,并启动...
  • renfufei
  • renfufei
  • 2014年11月24日 14:29
  • 24619

分析java dump文件

 注意,请不要被我误导,我没有看其他资料,这是我自己分析的,有些可能是不对的 "DestroyJavaVM" prio=6 tid=0x00316800 nid=0x448 waiting on co...
  • iceman1952
  • iceman1952
  • 2010年04月25日 12:21
  • 8537

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

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

通过 thread dump 分析找到高CPU耗用与内存溢出的Java代码

首先,要感谢我的好朋友 钊花 的经验分享。 相信大家在实际的工作当中,肯定会遇到由代码所导致的高CPU耗用以及内存溢出的情况。 通常这种情况发生时,我们会认为这些问题理所当然的该由开发人员自己去...
  • yufaw
  • yufaw
  • 2014年02月11日 10:19
  • 1999

java线上故障分析-线程dump,堆内存分析

  • 2013年04月24日 18:50
  • 1.62MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何Dump当前Java应用的内存结构,并进行分析找到占用空间最大的Class
举报原因:
原因补充:

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