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

  1. 系统宕机自动生成。
    IBM的JDK在系统宕机的时候会自动生成javacore,这也是我们经常用该JDK替换默认的缘故。

  2. 工具。

  3. ctrl break组合键。

  4. NMC控制台。
    NC自带的监控工具NMC可以直接点击对应server,右键直接生成javacore。
    该工具只针对于Websphere集群生效。对于单机 websphere或者NC中间件不生效。

  5. Websphere控制台。
    有的时候我们发现,系统卡死,或者需要同时生成多个Server的javacore的时候,
    我们就需要在websphere的控制台中直接生成。生成方式为Troubleshooting->Java dumps and cores。

  1. 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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Java糖果罐 扫码关注

关于javacore和dump文件相关推荐

  1. Thread dump文件抓取和分析(JCA工具)

    Thread dump文件抓取和分析 接下来分析CentOS下怎么抓取Thread dump文件,JCA怎么分析Thread dump文件. 1.CentOS下抓取Thread dump文件 Cent ...

  2. java 查看dump文件_[JAVA]JAVA章3 如何获取及查看DUMP文件

    一.dump基本概念 在故障定位(尤其是out of memory)和性能分析的时候,经常会用到一些文件来帮助我们排除代码问题.这些文件记录了JVM运行期间的内存占用.线程执行等情况,这就是我们常说的 ...

  3. Windows下dump文件生成与分析

    一.    生成Dump文件方式 1.1任务管理器 在程序崩溃后,先不关闭程序,在任务管理器中找到该程序对应的进程.右键->创建转储文件. 此时会在默认的目录下创建出一个dump文件. 可以看出 ...

  4. 如何手动生成Dump文件并分析Dump文件

    大家都知道,当服务器出现蓝屏问题时,我们需要获取系统所产生的DUMP文件进行分析,如何确保在系统问题发生时,可以正确的生成所需要的DUMP文件呢?我们需要做如下检查: 1).右键点击"我的电 ...

  5. JVM 在遇到OOM(OutOfMemoryError)时生成Dump文件的三种方式

    JVM 在遇到OOM(OutOfMemoryError)时生成Dump文件的三种方式,以及如何使用Eclips Memory Analyzer(MAT)插件进行堆内存分析. 方法一: jmap -du ...

  6. Linux上Core Dump文件的形成和分析

    Core,又称之为Core Dump文件,是Unix/Linux操作系统的一种机制,对于线上服务而言,Core令人闻之色变,因为出Core的过程意味着服务暂时不能正常响应,需要恢复,并且随着吐Core ...

  7. [Windows编程] 如何捕捉程序异常/crash 并生成 dump 文件

    前面介绍如如何用WinDBG 生成crash dump <WinDBG 技巧:如何生成Dump 文件(.dump 命令) >,但是用户机器上通常不安装WinDBG, 而且多数用户也不知道怎 ...

  8. git或者ssh出错 fatal:open /dev/null or dup failed: No such file or directory、弹出mitty.dump文件

    使用git Bash here闪退并生成mintty.exe.stackdump文件 cmd使用git 报错 fatal:open /dev/null or dup failed: No such f ...

  9. Linux下如何生成core dump 文件(解决segment fault段错误的问题)

    Linux下如何生成core dump 文件(解决segment fault段错误的问题) 参考文章: (1)Linux下如何生成core dump 文件(解决segment fault段错误的问题) ...

最新文章

  1. 去掉windows console application的dos显示
  2. 微信小程序 引用 map 地图,显示当前位置
  3. 是时候抛弃Java 7 – JBoss EAP 6.4了!
  4. java previous_java – 在枚举类型上实现`next`和`previous`的最好方法是什么?
  5. 人到六十岁还是黑头发好吗?
  6. 同济保研计算机,同济大学保研率28%,保研高校前四:复旦、北大、交大、清华...
  7. FFmpeg源代码简单分析:avio_open2()
  8. [转] Noise Contrastive Estimation 噪声对比估计 资料
  9. jsonp 返回以前必须要再转一次json
  10. java 存储多叉树_JAVA多叉树森林的构造、内存存储与遍历
  11. 4. ex 命令(1)
  12. Leetcode961. N-Repeated Element in Size 2N Array重复N次的元素
  13. 在SpringMVC中使用@RequestBody和@ResponseBody注解处理json时,报出HTTP Status 415的解决方案...
  14. 如何扩展计算机c盘的控件,电脑C盘空间不足,怎么把c盘空间可以扩大
  15. Java学生成绩管理系统主界面和登录界面参考
  16. 如何批量隔行删除Excel行
  17. vue 使用iframe展示pdf文件
  18. 使用kindeditor直接粘贴本地图片或者是qq截图
  19. 解决The kernel appears to have died. It will restart automatically问题
  20. .Net框架设计(Yanlz+Unity+XR+C#+.Net+框架+框架设计+设计模式+工具可视化+SOA+立钻哥哥+==)

热门文章

  1. Mac电脑通过ssh远程方法
  2. 本体(Ontology)
  3. 刚性防水套管止水环 通风穿墙套管
  4. 带有ANY(SOME)或ALL谓词子查询
  5. ironpython安装包_安装Python包 – IronPython
  6. 随笔:写软件,应该有点专业精神
  7. 【UE4笔记】C++游戏控制的摄像机
  8. ghost后找不到页面文件的解决办法
  9. 用 Joomla! 模板实现类似 Maycode.com 的新闻门户式首页布局
  10. Ubuntu 12.04编译mt6582错误 - Tracy Mcgrady的专栏 - 博客频道 - CSDN.NET awk: line 4: function strtonum never def