转:Java - Heap Dump, Thread Dump and Core Dump

Dump 就是对程序运行时内存上的信息进行转储, 让我们可以查看程序当时的运行情况. Dump 对于调优和排错是非常有用的工具.

Heap Dump

Java 运行时对象分配在堆内存上, Heap dump 就是对堆内存进行转储.

生成

Heap dump 的生成有两种方式:

1) 运行 Java 程序时添加 -XX:+HeapDumpOnOutOfMemoryError 选项, 这样当程序发生 Out of Memory 错误时就会自动生成一份 Heap dump.

2) 使用 jmap 工具生成. 首先我们用 jps 找到程序的 pid (严谨点说其实是 lvmid), 然后运行:

jmap -dump:live,format=b,file=heap.bin <pid>

分析

可以使用 Java 自带的 jhat 工具来分析 Heap dump:

jhat <heap dump file>

等待一会, 就会提示

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 虚拟机才有的.

生成

可以使用自带的 jstack 生成 Thread dump:

jstack <pid> >> thread.dump

分析

Thread dump 就是个文本文件格式, 直接打开查看就可以了.

Intellij IDEA 提供 Stacktrace 的分析, 我们可以用它来分析 Thread dump, 这样可以方便的知道某个线程运行到哪里.

打开 Intellij IDEAD -> Analyze -> Anaylyze Stacktrace..., 把 Thread dump 的内容复制粘贴进去, 确认即可.

Core Dump

上面提到的 Heap dump 和 Thread dump 都是和 Java 直接相关的, Core dump 则是操作系统提供的, 所有程序在意外退出时, 操作系统都可以生成 Core dump.

Core dump 包含了程序运行时的所有内存信息, 所以我们可以使用 Core dump 同时分析堆内存和运行时栈.

生成

默认操作系统是不生成 Core dump 的, 我们需要先打开:

# 如果你用的是 bash
ulimit -c unlimited

# 如果你像我一样用的是 zsh
limit coredumpsize unlimited

ulimit/limit 是设置 dump 的大小的, 默认为 0 也就是不 dump. 我们可以使用下面的命令来查看当前设置的大小:

# 如果你用的是 bash
ulimit -c

# 如果你像我一样用的是 zsh
limit coredumpsize

确认打开后, 我们可以使用 kill -ABRT <pid> 来生成 Core dump. 不过需要注意的是, 使用这种方法只有在当前 Terminal 下运行的 Java 程序才能生成 Core dump. 也就是说, 你必须在打开了 Core dump 的 Terminal 下运行 Java 程序, 这样 kill -ABRT <pid> 才会生成 Core dump. 如果你 Java 程序运行在一个没有打开 Core dump 的 Terminal 下, 那么即使你的 kill -ABRT <pid> 运行在打开了 Core dump 的 Terminal 下, 这时候 Core dump 也是不会生成的.

我们也可以使用 gcore 来生成生成 Core dump. 使用这个方法就无所谓你有没有使用 ulimit/limit 打开 Core dump 了.

sudo gcore <pid>

Mac 下 Core dump 生成在 /cores/ 文件夹下.

分析

我们可以使用 gdb 来分析 Core dump 文件.

Java 自带的 jstack 和 jmap 也可以用来分析 Core dump:

jstack <executable> <core dump file>
jmap <executable> <core dump file>

这里的 <executable> 指的是你运行 Java 程序时使用的 java, 一般可以用 $JAVA_HOME/bin/java 代替. 如果你指定的 java 和你运行用的 java 不是同一个版本, 就会抛出 sun.jvm.hotspot.debugger.UnmappedAddressException.

另外你使用的 jstack 和 jamp 也需要是相应的版本, 否则会提示 Can‘t attach to the core file.

转自:http://yoncise.com/2017/05/23/Java-Heap-Dump-Thread-Dump-and-Core-Dump/

原文地址:https://www.cnblogs.com/wuzhiyuan/p/9605456.html

时间: 2024-08-29 06:34:20

转:Java - Heap Dump, Thread Dump and Core Dump的相关文章

【调试】Core Dump是什么?Linux下如何正确永久开启?

内容简介 [调试]Core Dump是什么?Linux下如何正确永久开启? Core Dump是什么?Linux下如何正确永久开启? Core Dump是什么? Core Dump乍听之下很抽象. 当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump(中文有的翻译成"核心转储"). 我们可以认为Core Dump是"内存快照",但实际上,除了内存信息之外,还有些关键的程序运行状态也会同时dump

core dump

http://blog.csdn.net/tenfyguo/article/details/8159176/ 一,什么是coredump 我们经常听到大家说到程序core掉了,需要定位解决,这里说的大部分是指对应程序由于各种异常或者bug导致在运行过程中异常退出或者中止,并且在满足一定条件下(这里为什么说需要满足一定的条件呢?下面会分析)会产生一个叫做core的文件. 通常情况下,core文件会包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息还有各种函数调用堆栈信息等,我们可以理解为是

Linux使用笔记: 定制core dump文件的文件名

在开发过程中,当一个Linux程序异常退出时,我们可以通过core文件来分析它异常的详细原因.缺省情况下,Linux在程序异常时不产生core文件,要想让程序异常退出时产生core dump文件,需要使用ulimit命令更改coredump的设置: ulimit -c unlimited 上面的命令表示在程序异常时产生core dump文件,并且不对core dump文件的大小进行限制. 上述设置只是使能了core dump功能,缺省情况下,内核在coredump时所产生的core文件放在与该程

段错误Segment Fault定位,即core dump文件与gdb定位

使用C++开发系统有时会出现段错误,即Segment Fault.此类错误程序直接崩溃,通常没有任何有用信息输出,很难定位bug,因而无从解决问题.今天我们介绍core dump文件,并使用gdb进行调试,以此来定位段错误问题.此文同时用以备忘. 一.core dump Core dump也称核心转储, 当程序运行过程中异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 称之为core dump文件. 系统默认不生成core dump文件,可以使用ulimit命令进行查看和设

linux中core dump开启使用教程【转】

转自:http://www.111cn.net/sys/linux/67291.htm 一.什么是coredump 我们经常听到大家说到程序core掉了,需要定位解决,这里说的大部分是指对应程序由于各种异常或者bug导致在运行过程中异常退出或者中止,并且在满足一定条件下(这里为什么说需要满足一定的条件呢?下面会分析)会产生一个叫做core的文件. 通常情况下,core文件会包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息还有各种函数调用堆栈信息等,我们可以理解为是程序工作当前状态存储生

【Z】段错误Segment Fault定位,即core dump文件与gdb定位

使用C++开发系统有时会出现段错误,即Segment Fault.此类错误程序直接崩溃,通常没有任何有用信息输出,很难定位bug,因而无从解决问题.今天我们介绍core dump文件,并使用gdb进行调试,以此来定位段错误问题.此文同时用以备忘. 一.core dump Core dump也称核心转储, 当程序运行过程中异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 称之为core dump文件. 系统默认不生成core dump文件,可以使用ulimit命令进行查看和设

记一次Java Core Dump分析过程

#背景提要 很久没有亲自动手部署代码了,命令行的亲切感越来越低.放飞了键盘,习惯了鼠标操作的windows环境.冷不丁实操部署也是不错的. 常常在部署时,运维同学对于[hs_err_pid]文件视而不见.殊不知这是Java 虚拟机崩溃日志. #这次是如何分析问题的? 一.首先查看日志头文件 # # A fatal error has been detected by the Java Runtime Environment: # # SIGSEGV (0xb) at pc=0x00007f90e

[JAVA]JAVA章4 Thread Dump如何分析

一.Thread Dump介绍 1.1什么是Thread Dump? Thread Dump是非常有用的诊断Java应用问题的工具.每一个Java虚拟机都有及时生成所有线程在某一点状态的thread-dump的能力,虽然各个 Java虚拟机打印的thread dump略有不同,但是大多都提供了当前活动线程的快照,及JVM中所有Java线程的堆栈跟踪信息,堆栈信息一般包含完整的类名及所执行的方法,如果可能的话还有源代码的行数. 1.2 Thread Dump特点 1. 能在各种操作系统下使用 2.

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

jhat 是Java堆分析工具(Java heap Analyzes Tool). 在JDK6u7之后成为标配. 使用该命令需要有一定的Java开发经验,官方不对此工具提供技术支持和客户服务. 用法: jhat [ options ] heap-dump-file 参数: options 可选命令行参数,请参考下面的 Options heap-dump-file 要查看的二进制Java堆转储文件(Java binary heap dump file). 如果某个转储文件中包含了多份 heap d