Dump 就是对程序运行时内存上的信息进行转储, 让我们可以查看程序当时的运行情况. Dump 对于调优和排错是非常有用的工具.
Heap Dump
Java 运行时对象分配在堆内存上, Heap dump 就是对堆内存进行转储.
生成
jmap
通过命令jmap -dump:live,format=b,file=***.hprof pid
eg:jmap -dump:live,format=b,file=dump.hprof 48671
环境变量
-XX: HeapDumpOnOutOfMemoryError
当OutOfMemoryError发生时自动生成 Heap Dump 文件
-XX:HeapDumpPath=d:\test.hprof
指定 dump 文件存储路径
eclipse参数
eclipse中运行参数添加运行参数
-XX: HeapDumpOnOutOfMemoryError ##dump出当前的内存堆转储快照
-XX:HeapDumpPath=E:\job ##指定路径(转储文件还是挺大的)
jconsole
ps:好像生成dump文件,然后把后缀改成hprof也可以(忘了从哪里看到的了,用它须谨慎)
jvisualvm
-Xrunhprof:head=site
在JVM的配置参数中添加 -Xrunhprof:head=site
参数,会生成java.hprof.txt 文件,不过这样会影响JVM的运行效率,不建议在生产环境中使用(未亲测)。
分析
可以使用 Java 自带的 jhat 工具来分析 Heap dump:
jhat
等待一会, 就会提示
Started HTTP server on port 7000
Server is ready.
这时候浏览器中访问 127.0.0.1:7000 就可以了.
但是, jhat 在分析较大的 Heap dump 时效率比较差, 所以推荐使用 eclipse 提供的 Memory Analyzer (MAT) 来分析.
Thread Dump
Thread dump 转储的是线程相关的内存数据 (例如该线程的调用栈). Thread dump 有时候也被称为 javacore, 不过好像 javacore 是 IBM 虚拟机才有的.
生成
VisualVM Profiler
右键选择线程Dump便会自动生成线程转储文件,当然你也可以连接远程机器对其进行监控和分析
jstack
jdk自带的工具jstack通过它我们也可以生成应用程序的线程转储文件,只需要两步即可完成:
1>找到应用程序的进程ID
ps -eaf | grep java
2> 输出线程转储信息到文件或控制台
jstack PID >> mydumps.tdump
jstack PID
kill -3 PID
该方法与其它生成线程转储文件的方法略有不同,当kill命令发出时,线程存储文件将在该应用程序的外部生成,如果java程序是一个Tomcat服务器,带有系统输出文件catalina.out,那么将在此文件中生成线程转储
ps:这个东西准确的说不只能生成thread dump,还能生成下面的core dump,如果是系统的应用生成的就是core dump比如:sleep 100 & ,而且能够通过第三节中的设置修改core文件的路径从而进行转储,但是如果java进程的话,会生成thread dump,这样的话就不能够将相应的内容转储到自己制定的文件中了(至少我没没有尝试成功,而且网上也没有找到相关的资料),只会产生在终端(前台启动的程序)、nohup.out(后台启动的应用)、catalina.out(tomcat应用)、weblogic等应用同理。
注意上面的javacore是ibmjdk中特有的是thread dump的意思,core dump是操作系统级别的,kill -3 在aix的ibmjdk中通过设置java运行时参数-Xdump:java heap system snap:events=user能生成javacore,且通过export IBM_JAVACOREDIR=/dumpfile export IBM_COREDIR=/dumpfile设置相应的文件的位置
综上,sun/oracle的jdk目前看无法对kill -3 生成的thread dump进行转储,但是ibm的jdk可以对kill -3 生成的thread dump进行转储但是这里叫做javacore,这个名字也是ibm jdk特有的
jcmd
jdk8中介绍了jcmd工具,在jdk8及以上环境下,可以使用此命令生成线程转储文件
命令是:
jcmd PID Thread.print
分析
Thread dump 就是个文本文件格式, 直接打开查看就可以了.看到thrad dump的后缀有txt、dump、tdump、log等,看来这个后缀确实没啥用
idea
Intellij IDEA 提供 Stacktrace 的分析, 我们可以用它来分析 Thread dump, 这样可以方便的知道某个线程运行到哪里.
打开 Intellij IDEAD -> Analyze -> Anaylyze Stacktrace…, 把 Thread dump 的内容复制粘贴进去, 确认即可.
jvisualvm
使用方式:直接双击打开jvisualvm.exe,点击文件->装入,在文件类型那一栏选择堆,选择要分析的dump文件,打开。
MAT(推荐)
这个就很棒,能够追踪到源码级别的
这个稍后会写到博文中,因为图片比较多,稍后粘贴出链接
Jhat
一个通过起那段页面解析的,比较简陋,不是很推荐
Core Dump
上面提到的 Heap dump 和 Thread dump 都是和 Java 直接相关的, Core dump 则是操作系统提供的, 所有程序在意外退出时, 操作系统都可以生成 Core dump.
Core dump 包含了程序运行时的所有内存信息, 所以我们可以使用 Core dump 同时分析堆内存和运行时栈.
生成
gcore
默认操作系统是不生成 Core dump 的, 我们需要先打开:
如果你用的是 bash
ulimit -c unlimited
如果你像我一样用的是 zsh
limit coredumpsize unlimited
ulimit/limit 是设置 dump 的大小的, 默认为 0 也就是不 dump. 我们可以使用下面的命令来查看当前设置的大小:
如果你用的是 bash
ulimit -c
如果你像我一样用的是 zsh
limit coredumpsize
确认打开后, 我们可以使用 kill -ABRT 来生成 Core dump. 不过需要注意的是, 使用这种方法只有在当前 Terminal 下运行的 Java 程序才能生成 Core dump. 也就是说, 你必须在打开了 Core dump 的 Terminal 下运行 Java 程序, 这样 kill -ABRT 才会生成 Core dump. 如果你 Java 程序运行在一个没有打开 Core dump 的 Terminal 下, 那么即使你的 kill -ABRT 运行在打开了 Core dump 的 Terminal 下, 这时候 Core dump 也是不会生成的.
我们也可以使用 gcore 来生成生成 Core dump. 使用这个方法就无所谓你有没有使用 ulimit/limit 打开 Core dump 了.
sudo gcore
Mac 下 Core dump 生成在 /cores/ 文件夹下.
kill -3 PID
该方法与其它生成线程转储文件的方法略有不同,当kill命令发出时,线程存储文件将在该应用程序的外部生成,如果java程序是一个Tomcat服务器,带有系统输出文件catalina.out,那么将在此文件中生成线程转储
ps:这个东西准确的说不只能生成thread dump,还能生成下面的core dump,如果是系统的应用生成的就是core dump比如:sleep 100 & ,而且能够通过第三节中的设置修改core文件的路径从而进行转储,但是如果java进程的话,会生成thread dump,这样的话就不能够将相应的内容转储到自己制定的文件中了(至少我没没有尝试成功,而且网上也没有找到相关的资料),只会产生在终端(前台启动的程序)、nohup.out(后台启动的应用)、catalina.out(tomcat应用)、weblogic等应用同理。
注意上面的javacore是ibmjdk中特有的是thread dump的意思,core dump是操作系统级别的,kill -3 在aix的ibmjdk中通过设置java运行时参数-Xdump:java heap system snap:events=user能生成javacore,且通过export IBM_JAVACOREDIR=/dumpfile export IBM_COREDIR=/dumpfile设置相应的文件的位置
综上,sun/oracle的jdk目前看无法对kill -3 生成的thread dump进行转储,但是ibm的jdk可以对kill -3 生成的thread dump进行转储但是这里叫做javacore,这个名字也是ibm jdk特有的
须知:
每次用之前运行下下面两句
ulimit -c unlimited
sysctl -w kernel.core_pattern=/var/crash/core.%u.%e.%p
分析
我们可以使用 gdb 来分析 Core dump 文件.
Java 自带的 jstack 和 jmap 也可以用来分析 Core dump(补充下还有jinfo):
jstack
jmap
jinfo
这里的 指的是你运行 Java 程序时使用的 java, 一般可以用 $JAVA_HOME/bin/java 代替. 如果你指定的 java 和你运行用的 java 不是同一个版本, 就会抛出 sun.jvm.hotspot.debugger.UnmappedAddressException.
另外你使用的 jstack 和 jamp 也需要是相应的版本, 否则会提示 Can’t attach to the core file.
问题
jmap /usr/local/jdk/jdk1.8.0_73/bin/java core.dump.2878
或者
$JAVA_HOME/bin/java -jar xxx.jar
$JAVA_HOME/bin/jstack 8419 > core.8419
$JAVA_HOME/bin/jstack $JAVA_HOME/bin/java /var/crash/core.18470
网上描述出现这种错误的原因都是java环境不同意导致的。
https://blog.csdn.net/liyf155/article/details/65628209
如上我通过这种方式还是不行,已经保证了,所有的java地址都是统一的还是不行。
还有人说是超过2G的core文件就不行了,我看了一下我的只有几百k
https://blog.csdn.net/mynamepg/article/details/81670358
如下图:
综上所述,这个问题,我倒现在都没有解决,希望知道问题的盆友可以私信我哈~
转自:
http://yoncise.com/2017/05/23/Java-Heap-Dump-Thread-Dump-and-Core-Dump/
https://www.cnblogs.com/wuzhiyuan/p/9605456.html
Aix系统篇
aix系统如何生成这些个dump文件呢?
生成
Kill -3
kill -3 pid
必须在jvm运行前加上参数:
-Xdump:java heap system snap:events=user
kill -3 生成的dmp txt文件到特定的目录,则需要配置如下的环境变量。(其他格式的文件自行查询,因为这里只需要dmp文件,所以目前先这样)
export IBM_JAVACOREDIR=/dumpfile
export IBM_COREDIR=/dumpfile
java -Xrunhprof(内存泄漏分析)
java -Xrunhprof:heap=dump,format=b,file=java.hprof -jar tomcat_jvm_thread_demo-1.0-SNAPSHOT.jar
演示一下:
通过这种方式启动,然后ctrl c停止可以看到heap。。。done
Tomcat、weblogic、jboss等应该是一样的配置jvm参数,这里我只是用了一个简单的例子
ps:切记,不要通过kill -9 停止,不行的我试过,应该是这样瞬间停止会把hprof文件损坏
在当前的目录下ls
看到生成了这个文件然后下载到本地,通过MAT等软件进行查看
官方文档:
java -Xrunhprof https://www.ibm.com/support/knowledgecenter/zh/SSYKE2_8.0.0/com.ibm.java.80.doc/diag/tools/hprof.html
分析
jextract
jextract xxx.dmp -nozip
这里的dum是上面生成的dmp文件,注意一定要加入-nozip参数,否则无法生成xml文件,下面的指令无法执行
jdmpview
有一个命令格式
jdmpview -outfile out.txt [-overwrite|-append] -cmdfile commands.txt -core <path to core file>
即
/usr/java6_64/bin/jdmpview -core core.20191205.210332.3932390.0009.dmp </leesin/commands.txt >/leesin/out.txt
commands.txt 中内容是info class,最后就会在out.txt中保存着和jmap分析类占用内存信息一样的东西了
当然这种是简便方式,其实完整的是
//注意这里的jdmpview最好写全路径
/usr/java6_64/bin/jdmpview -core core.20191205.210332.3932390.0009.dmp
然后会跳出弹框,让输入子命令,如果希望查看类占红内存信息呢就输入info class即可,其他的可以查看官方文档或者子命令help
jdmpView的官方文档:https://www.ibm.com/support/knowledgecenter/SSYKE2_7.0.0/com.ibm.java.lnx.70.doc/diag/tools/dump_viewer_dtfjview/dump_viewer.html
Stack Overflow:https://stackoverflow.com/questions/5576672/force-or-generate-jvm-core-dump-ibm-jvm
另一种jdmpview:https://blog.csdn.net/iteye_2535/article/details/81848367
关于更多jextract的命令详解可以看一下这个博客(包括kill -3能够生成的文件的详解,很不错的文章):http://blog.itpub.net/14710393/viewspace-754352/
批处理页面:https://www.ibm.com/support/knowledgecenter/SSYKE2_7.0.0/com.ibm.java.lnx.70.doc/diag/tools/dump_viewer_dtfjview/dump_viewer_batch_mode.html
重定向的需要在写代码的时候重点考虑下:https://blog.csdn.net/qq_26765193/article/details/83189393
添加kill -3的重定向文件目录的环境变量。
https://www.ibm.com/support/pages/ibm-java-aix-mustgather-data-collection-procedure-java-jit-issues(主要看这个)
https://developer.ibm.com/answers/questions/211533/i-want-to-create-heapdumps-from-was-in-tip-but-i-c/
https://www.ibm.com/support/pages/websphere-application-server-dump-locations-and-setup
https://www.suse.com/support/kb/doc/?id=7012623
https://www.ibm.com/support/pages/changing-location-javacore-heapdump-and-core-file-generated-tip
MAT
导入当菜上面生成的hprof文件
IBM Monitoring and Diagnostic Tools
java -Xrunhprof的官方文档: https://www.ibm.com/support/knowledgecenter/zh/SSYKE2_8.0.0/com.ibm.java.80.doc/diag/tools/hprof.html
在这个官方文档中找到线索:
使用 IBM Monitoring and Diagnostic Tools:https://www.ibm.com/support/knowledgecenter/zh/SSYKE2_8.0.0/com.ibm.java.80.doc/diag/tools/healthcenter.html
官方文档中:
可以看到是jdmpview的GUI方式,也许这个工具真的是最适用于IBM jdk的工具了。
但是我没有去深究,因为MAT已经能够帮助我解决问题了
详文
写过一个完整的通过aix系统分析内存泄漏的文章:
链接:https://blog.csdn.net/dataiyangu/article/details/103429954
引用
JAVACORE篇:
BM JDK:V9
-
系统宕机自动生成。
IBM的JDK在系统宕机的时候会自动生成javacore,这也是我们经常用该JDK替换默认的缘故。 -
工具。
-
ctrl break组合键。
-
NMC控制台。
NC自带的监控工具NMC可以直接点击对应server,右键直接生成javacore。
该工具只针对于Websphere集群生效。对于单机 websphere或者NC中间件不生效。 -
Websphere控制台。
有的时候我们发现,系统卡死,或者需要同时生成多个Server的javacore的时候,
我们就需要在websphere的控制台中直接生成。生成方式为Troubleshooting->Java dumps and cores。
- JSP小补丁程序。
该程序是自己编写的jsp小程序。
使用方式为,将javacore.jsp放置到nchome/hotwebs/nc_web下即可,重启生效。
访问的时候,通过ip地址 端口 javacore.jsp即可在JAVA_HOME中生成。
如127.0.0.1:9081/javacore.jsp。补丁在附件中。
主要调用IBM的JDK内部方法com.ibm.jvm.Dump.JavaDump();
作者:小漠穷秋
链接:https://www.jianshu.com/p/37b1b32bc6f3
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
HEAPDUMP篇:
IBM JDK:V9
1.系统宕机自动生成。
2.利用coredump功能。
利用websphere自带的coredump功能,可以将所有宕机时的堆栈信息全部输出。
包含堆中对象的具体信息,如hashmap中的键值都可以看到具体的值。
是跟踪宕机问题的终极法宝。
具体方法为,在JVM中添加参数: - -Xdump:system:events=user,request=exclusive prewalk compact
3.JSP小补丁程序。
该程序是自己编写的jsp小程序。
使用方式为,将heapdump.jsp放置到nchome/hotwebs/nc_web下即可,重启生效。
访问的时候,通过ip地址 端口 heapdump.jsp即可在JAVA_HOME中生成。
如127.0.0.1:9081/heapdump.jsp。补丁在附件中。
主要调用IBM的JDK内部方法com.ibm.jvm.Dump.HeapDump();
作者:小漠穷秋
链接:https://www.jianshu.com/p/37b1b32bc6f3
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
![](https://i-blog.csdnimg.cn/blog_migrate/30291df46767d80aecce1823c1b0d870.png)