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

Dump 就是對程序運行時內存上的信息進行轉儲, 讓咱們能夠查看程序當時的運行狀況. Dump 對於調優和排錯是很是有用的工具.java

Heap Dump

Java 運行時對象分配在堆內存上, Heap dump 就是對堆內存進行轉儲.瀏覽器

生成

Heap dump 的生成有兩種方式:bash

1) 運行 Java 程序時添加 -XX:+HeapDumpOnOutOfMemoryError 選項, 這樣當程序發生 Out of Memory 錯誤時就會自動生成一份 Heap dump.app

2) 使用 jmap 工具生成. 首先咱們用 jps 找到程序的 pid (嚴謹點說實際上是 lvmid), 而後運行:eclipse

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

分析

可使用 Java 自帶的 jhat 工具來分析 Heap dump:jvm

jhat <heap dump file>

等待一會, 就會提示工具

Started HTTP server on port 7000
Server is ready.

這時候瀏覽器中訪問 127.0.0.1:7000 就能夠了.spa

可是, 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/

相關文章
相關標籤/搜索