Dump 就是對程序運行時內存上的信息進行轉儲, 讓咱們能夠查看程序當時的運行狀況. Dump 對於調優和排錯是很是有用的工具.java
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 有時候也被成爲 javacore, 不過好像 javacore 是 IBM 虛擬機纔有的.線程
可使用自帶的 jstack
生成 Thread dump:
jstack <pid> >> thread.dump
Thread dump 就是個文本文件格式, 直接打開查看就能夠了.
Intellij IDEA 提供 Stacktrace 的分析, 咱們能夠用它來分析 Thread dump, 這樣能夠方便的知道某個線程運行到哪裏.
打開 Intellij IDEAD -> Analyze -> Anaylyze Stacktrace...
, 把 Thread 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/