Java命令:jhat(Java Heap Analysis Tool)

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

然后在訪問http://localhost:7000/

頁面如下:


jhat_image01.png

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

一般查看堆異常情況主要看這個兩個部分:

  1. Show instance counts for all classes (excluding platform)猾愿,平臺外的所有對象信息鹦聪。如下圖:


    jhat_image02.png
  1. 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ā)可以在幫助頁面查看喘蟆,這里就不詳細講解了缓升。

參考資料

jhat

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蕴轨,隨后出現(xiàn)的幾起案子港谊,更是在濱河造成了極大的恐慌,老刑警劉巖橙弱,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件歧寺,死亡現(xiàn)場離奇詭異,居然都是意外死亡棘脐,警方通過查閱死者的電腦和手機斜筐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蛀缝,“玉大人顷链,你說我怎么就攤上這事∏海” “怎么了嗤练?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長在讶。 經(jīng)常有香客問我煞抬,道長,這世上最難降的妖魔是什么构哺? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任革答,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘残拐。我一直安慰自己途茫,他們只是感情好,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布蹦骑。 她就那樣靜靜地躺著慈省,像睡著了一般。 火紅的嫁衣襯著肌膚如雪眠菇。 梳的紋絲不亂的頭發(fā)上边败,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機與錄音捎废,去河邊找鬼笑窜。 笑死,一個胖子當著我的面吹牛登疗,可吹牛的內(nèi)容都是我干的排截。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼辐益,長吁一口氣:“原來是場噩夢啊……” “哼断傲!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起智政,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤认罩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后续捂,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體垦垂,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年牙瓢,在試婚紗的時候發(fā)現(xiàn)自己被綠了劫拗。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡矾克,死狀恐怖页慷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情胁附,我是刑警寧澤差购,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站汉嗽,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏找蜜。R本人自食惡果不足惜饼暑,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧弓叛,春花似錦彰居、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至毕籽,卻和暖如春抬闯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背关筒。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工溶握, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蒸播。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓睡榆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親袍榆。 傳聞我的和親對象是個殘疾皇子胀屿,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 運用jvm自帶的命令可以方便的在生產(chǎn)監(jiān)控和打印堆棧的日志信息幫忙我們來定位問題!雖然jvm調(diào)優(yōu)成熟的工具已經(jīng)有很多...
    Java_Explorer閱讀 680評論 0 2
  • 以下是Java自帶的性能監(jiān)控工具 必要時我們需要抓取Java全內(nèi)存的Dump來分析包雀,抓取方式有如下: | jhat...
    jackcooper閱讀 938評論 2 10
  • 之前看過一篇文章宿崭,叫做一萬小時天才理論。講述了一個人在專業(yè)理論上努力一萬小時就能成為專家的觀點馏艾。這個理論并不是放之...
    hellokazhang閱讀 279評論 0 1
  • 我拖著沉重的行李箱終于下定了決心琅摩,離開這個讓我連呼吸都壓抑的城市铁孵,偏偏這時下起了蒙蒙細雨。我看了看手表房资,為了不...
    石邑公主閱讀 222評論 0 0