jhat(Java Heap Analysis Tool)
jhat(Java Heap Analysis Tool),是一個用來分析java的堆情況的命令。之前的文章講到過旬痹,使用jmap可以生成Java堆的Dump文件。生成dump文件之后就可以用jhat命令便斥,將dump文件轉(zhuǎn)成html的形式挚冤,然后通過http訪問可以查看堆情況呢诬。
jhat命令解析會Java堆dump并啟動一個web服務器利诺,然后就可以在瀏覽器中查看堆的dump文件了富蓄。
示例:
1、導出dump文件
關(guān)于dump文件的生成可以看jmap命令的詳細介紹.
1.運行java程序
/**
* Created by hollis on 16/1/21.
*/
public class JhatTest {
public static void main(String[] args) {
while(true) {
String string = new String("hollis");
System.out.println(string);
}
}
}
2.查看該進程的ID
HollisMacBook-Air:apaas hollis$ jps -l
68680 org.jetbrains.jps.cmdline.Launcher
62247 com.intellij.rt.execution.application.AppMain
69038 sun.tools.jps.Jps
使用jps命令查看發(fā)現(xiàn)有三個java進程在運行慢逾,一個是我的IDEA使用的進程68680立倍,一個是JPS命令使用的進程69038,另外一個就是上面那段代碼運行的進程62247侣滩。
3.生成dump文件
HollisMacBook-Air:test hollis$ jmap -dump:format=b,file=heapDump 62247
Dumping heap to /Users/hollis/workspace/test/heapDump ...
Heap dump file created
以上命令可以將進程6900的堆dump文件導出到heapDump文件中帐萎。
查看當前目錄就能看到heapDump文件。
除了使用jmap命令胜卤,還可以通過以下方式:
1、使用 jconsole 選項通過 HotSpotDiagnosticMXBean 從運行時獲得堆轉(zhuǎn)儲(生成dump文件)赁项、
2葛躏、虛擬機啟動時如果指定了 -XX:+HeapDumpOnOutOfMemoryError 選項, 則在拋出 OutOfMemoryError 時, 會自動執(zhí)行堆轉(zhuǎn)儲。
3悠菜、使用 hprof 命令
2舰攒、解析Java堆轉(zhuǎn)儲文件,并啟動一個 web server
HollisMacBook-Air:apaas hollis$ jhat heapDump
Reading from heapDump...
Dump file created Thu Jan 21 18:59:51 CST 2016
Snapshot read, resolving...
Resolving 341297 objects...
Chasing references, expect 68 dots....................................................................
Eliminating duplicate references....................................................................
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.
使用jhat命令,就啟動了一個http服務悔醋,端口是7000
頁面如下:
3摩窃、分析
在瀏覽器里面看到dump文件之后就可以進行分析了。這個頁面會列出當前進程中的所有對像情況。
該頁面提供了幾個查詢功能可供使用:
All classes including platform//
Show all members of the rootset
Show instance counts for all classes (including platform)
Show instance counts for all classes (excluding platform)
Show heap histogram
Show finalizer summary
Execute Object Query Language (OQL) query
一般查看堆異常情況主要看這個兩個部分:
-
Show instance counts for all classes (excluding platform)猾愿,平臺外的所有對象信息鹦聪。如下圖:
jhat_image02.png
-
Show heap histogram 以樹狀圖形式展示堆情況。如下圖:
jhat_image03.png
具體排查時需要結(jié)合代碼蒂秘,觀察是否大量應該被回收的對象在一直被引用或者是否有占用內(nèi)存特別大的對象無法被回收泽本。
用法摘要
這一部分放在后面介紹的原因是一般不太使用。
HollisMacBook-Air:~ hollis$ jhat -help
Usage: jhat [-stack <bool>] [-refs <bool>] [-port <port>] [-baseline <file>] [-debug <int>] [-version] [-h|-help] <file>
-J<flag> Pass <flag> directly to the runtime system. For
example, -J-mx512m to use a maximum heap size of 512MB
-stack false: Turn off tracking object allocation call stack.
-refs false: Turn off tracking of references to objects
-port <port>: Set the port for the HTTP server. Defaults to 7000
-exclude <file>: Specify a file that lists data members that should
be excluded from the reachableFrom query.
-baseline <file>: Specify a baseline object dump. Objects in
both heap dumps with the same ID and same class will
be marked as not being "new".
-debug <int>: Set debug level.
0: No debug output
1: Debug hprof file parsing
2: Debug hprof file parsing, no server
-version Report version number
-h|-help Print this help and exit
<file> The file to read
-stack false|true
關(guān)閉對象分配調(diào)用棧跟蹤(tracking object allocation call stack)姻僧。 如果分配位置信息在堆轉(zhuǎn)儲中不可用. 則必須將此標志設置為 false. 默認值為 true.
-refs false|true
關(guān)閉對象引用跟蹤(tracking of references to objects)规丽。 默認值為 true. 默認情況下, 返回的指針是指向其他特定對象的對象,如反向鏈接或輸入引用(referrers or incoming references), 會統(tǒng)計/計算堆中的所有對象。
-port port-number
設置 jhat HTTP server 的端口號. 默認值 7000.
-exclude exclude-file
指定對象查詢時需要排除的數(shù)據(jù)成員列表文件(a file that lists data members that should be excluded from the reachable objects query)撇贺。 例如, 如果文件列列出了 java.lang.String.value , 那么當從某個特定對象 Object o 計算可達的對象列表時, 引用路徑涉及 java.lang.String.value 的都會被排除赌莺。
-baseline exclude-file
指定一個基準堆轉(zhuǎn)儲(baseline heap dump)。 在兩個 heap dumps 中有相同 object ID 的對象會被標記為不是新的(marked as not being new). 其他對象被標記為新的(new). 在比較兩個不同的堆轉(zhuǎn)儲時很有用.
-debug int
設置 debug 級別. 0 表示不輸出調(diào)試信息松嘶。 值越大則表示輸出更詳細的 debug 信息.
-version
啟動后只顯示版本信息就退出
-J< flag >
因為 jhat 命令實際上會啟動一個JVM來執(zhí)行, 通過 -J 可以在啟動JVM時傳入一些啟動參數(shù). 例如, -J-Xmx512m 則指定運行 jhat 的Java虛擬機使用的最大堆內(nèi)存為 512 MB. 如果需要使用多個JVM啟動參數(shù),則傳入多個 -Jxxxxxx.
OQL
jhat還提供了一種對象查詢語言(Object Query Language)艘狭,OQL有點類似SQL,可以用來查詢。
OQL語句的執(zhí)行頁面: http://localhost:7000/oql/
OQL幫助信息頁面為: http://localhost:7000/oqlhelp/
OQL的預發(fā)可以在幫助頁面查看喘蟆,這里就不詳細講解了缓升。