Java命令: Jmap

Jmap

jmap是JDK自帶的工具軟件,主要用于打印指定Java進(jìn)程(或核心文件、遠(yuǎn)程調(diào)試服務(wù)器)的共享對象內(nèi)存映射或堆內(nèi)存細(xì)節(jié)拟糕。可以使用jmap生成Heap Dump倦踢。在Java命令Java Dump和Java命令:Jstack中分別有關(guān)于Java Dump以及線程 Dump的介紹送滞。 這篇文章主要介紹Java的堆Dump以及jmap命令

什么是堆Dump

基礎(chǔ)知識(shí)

Java虛擬機(jī)的內(nèi)存組成以及堆內(nèi)存介紹
Java GC工作原理

常見內(nèi)存錯(cuò)誤:

outOfMemoryError 年老代內(nèi)存不足。
outOfMemoryError:PermGen Space 永久代內(nèi)存不足辱挥。
outOfMemoryError:GC overhead limit exceed 垃圾回收時(shí)間占用系統(tǒng)運(yùn)行時(shí)間的98%或以上犁嗅。

jmap 用法摘要

Usage:
    jmap [option] <pid>
        (to connect to running process)
    jmap [option] <executable <core>
        (to connect to a core file)
    jmap [option] [server_id@]<remote server IP or hostname>
        (to connect to remote debug server)

where <option> is one of:
    <none>               to print same info as Solaris pmap
    -heap                to print java heap summary
    -histo[:live]        to print histogram of java object heap; if the "live"
                         suboption is specified, only count live objects
    -permstat            to print permanent generation statistics
    -finalizerinfo       to print information on objects awaiting finalization
    -dump:<dump-options> to dump java heap in hprof binary format
                         dump-options:
                           live         dump only live objects; if not specified,
                                        all objects in the heap are dumped.
                           format=b     binary format
                           file=<file>  dump heap to <file>
                         Example: jmap -dump:live,format=b,file=heap.bin <pid>
    -F                   force. Use with -dump:<dump-options> <pid> or -histo
                         to force a heap dump or histogram when <pid> does not
                         respond. The "live" suboption is not supported
                         in this mode.
    -h | -help           to print this help message
    -J<flag>             to pass <flag> directly to the runtime system
  • 指定進(jìn)程號(pid)的進(jìn)程 jmap [ option ]
  • 指定核心文件 jmap [ option ]
  • 指定遠(yuǎn)程調(diào)試服務(wù)器 jmap [ option ] [server-id@]

參數(shù):

  • option 選項(xiàng)參數(shù)是互斥的(不可同時(shí)使用)。想要使用選項(xiàng)參數(shù)晤碘,直接跟在命令名稱后即可褂微。
  • pid 需要打印配置信息的進(jìn)程ID。該進(jìn)程必須是一個(gè)Java進(jìn)程园爷。想要獲取運(yùn)行的Java進(jìn)程列表宠蚂,你可以使用jps。
  • executable 產(chǎn)生核心dump的Java可執(zhí)行文件童社。
  • core 需要打印配置信息的核心文件求厕。
  • remote-hostname-or-IP 遠(yuǎn)程調(diào)試服務(wù)器的(請查看jsadebugd)主機(jī)名或IP地址。
  • server-id 可選的唯一id叠洗,如果相同的遠(yuǎn)程主機(jī)上運(yùn)行了多臺(tái)調(diào)試服務(wù)器甘改,用此選項(xiàng)參數(shù)標(biāo)識(shí)服務(wù)器。

選項(xiàng):

  • <no option> 如果使用不帶選項(xiàng)參數(shù)的jmap打印共享對象映射灭抑,將會(huì)打印目標(biāo)虛擬機(jī)中加載的每個(gè)共享對象的起始地址十艾、映射大小以及共享對象文件的路徑全稱。這與Solaris的pmap工具比較相似腾节。
  • -dump:[live,]format=b,file=<filename> 以hprof二進(jìn)制格式轉(zhuǎn)儲(chǔ)Java堆到指定filename的文件中忘嫉。live子選項(xiàng)是可選的。如果指定了live子選項(xiàng)案腺,堆中只有活動(dòng)的對象會(huì)被轉(zhuǎn)儲(chǔ)庆冕。想要瀏覽heap dump,你可以使用jhat(Java堆分析工具)讀取生成的文件劈榨。
  • -finalizerinfo 打印等待終結(jié)的對象信息访递。
  • -heap 打印一個(gè)堆的摘要信息,包括使用的GC算法同辣、堆配置信息和generation wise heap usage拷姿。
  • -histo[:live] 打印堆的柱狀圖惭载。其中包括每個(gè)Java類、對象數(shù)量响巢、內(nèi)存大小(單位:字節(jié))描滔、完全限定的類名。打印的虛擬機(jī)內(nèi)部的類名稱將會(huì)帶有一個(gè)’*’前綴踪古。如果指定了live子選項(xiàng)含长,則只計(jì)算活動(dòng)的對象。
  • -permstat 打印Java堆內(nèi)存的永久保存區(qū)域的類加載器的智能統(tǒng)計(jì)信息伏穆。對于每個(gè)類加載器而言拘泞,它的名稱、活躍度枕扫、地址田弥、父類加載器、它所加載的類的數(shù)量和大小都會(huì)被打印铡原。此外偷厦,包含的字符串?dāng)?shù)量和大小也會(huì)被打印。
  • -F 強(qiáng)制模式燕刻。如果指定的pid沒有響應(yīng)只泼,請使用jmap -dump或jmap -histo選項(xiàng)。此模式下卵洗,不支持live子選項(xiàng)请唱。
  • -h 打印幫助信息。
  • -help 打印幫助信息过蹂。
  • -J<flag> 指定傳遞給運(yùn)行jmap的JVM的參數(shù)十绑。

示例:

查看java 堆(heap)使用情況,執(zhí)行命令: jmap -heap 31846

Attaching to process ID 31846, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.71-b01

using thread-local object allocation.
Parallel GC with 4 thread(s)//GC 方式

Heap Configuration: //堆內(nèi)存初始化配置
   MinHeapFreeRatio = 0 //對應(yīng)jvm啟動(dòng)參數(shù)-XX:MinHeapFreeRatio設(shè)置JVM堆最小空閑比率(default 40)
   MaxHeapFreeRatio = 100 //對應(yīng)jvm啟動(dòng)參數(shù) -XX:MaxHeapFreeRatio設(shè)置JVM堆最大空閑比率(default 70)
   MaxHeapSize      = 2082471936 (1986.0MB) //對應(yīng)jvm啟動(dòng)參數(shù)-XX:MaxHeapSize=設(shè)置JVM堆的最大大小
   NewSize          = 1310720 (1.25MB)//對應(yīng)jvm啟動(dòng)參數(shù)-XX:NewSize=設(shè)置JVM堆的‘新生代’的默認(rèn)大小
   MaxNewSize       = 17592186044415 MB//對應(yīng)jvm啟動(dòng)參數(shù)-XX:MaxNewSize=設(shè)置JVM堆的‘新生代’的最大大小
   OldSize          = 5439488 (5.1875MB)//對應(yīng)jvm啟動(dòng)參數(shù)-XX:OldSize=<value>:設(shè)置JVM堆的‘老生代’的大小
   NewRatio         = 2 //對應(yīng)jvm啟動(dòng)參數(shù)-XX:NewRatio=:‘新生代’和‘老生代’的大小比率
   SurvivorRatio    = 8 //對應(yīng)jvm啟動(dòng)參數(shù)-XX:SurvivorRatio=設(shè)置年輕代中Eden區(qū)與Survivor區(qū)的大小比值 
   PermSize         = 21757952 (20.75MB)  //對應(yīng)jvm啟動(dòng)參數(shù)-XX:PermSize=<value>:設(shè)置JVM堆的‘永生代’的初始大小
   MaxPermSize      = 85983232 (82.0MB)//對應(yīng)jvm啟動(dòng)參數(shù)-XX:MaxPermSize=<value>:設(shè)置JVM堆的‘永生代’的最大大小
   G1HeapRegionSize = 0 (0.0MB)

Heap Usage://堆內(nèi)存使用情況
PS Young Generation
Eden Space://Eden區(qū)內(nèi)存分布
   capacity = 33030144 (31.5MB)//Eden區(qū)總?cè)萘?   used     = 1524040 (1.4534378051757812MB)  //Eden區(qū)已使用
   free     = 31506104 (30.04656219482422MB)  //Eden區(qū)剩余容量
   4.614088270399305% used //Eden區(qū)使用比率
From Space:  //其中一個(gè)Survivor區(qū)的內(nèi)存分布
   capacity = 5242880 (5.0MB)
   used     = 0 (0.0MB)
   free     = 5242880 (5.0MB)
   0.0% used
To Space:  //另一個(gè)Survivor區(qū)的內(nèi)存分布
   capacity = 5242880 (5.0MB)
   used     = 0 (0.0MB)
   free     = 5242880 (5.0MB)
   0.0% used
PS Old Generation //當(dāng)前的Old區(qū)內(nèi)存分布
   capacity = 86507520 (82.5MB)
   used     = 0 (0.0MB)
   free     = 86507520 (82.5MB)
   0.0% used
PS Perm Generation//當(dāng)前的 “永生代” 內(nèi)存分布
   capacity = 22020096 (21.0MB)
   used     = 2496528 (2.3808746337890625MB)
   free     = 19523568 (18.619125366210938MB)
   11.337498256138392% used

670 interned Strings occupying 43720 bytes.

查看堆內(nèi)存(histogram)中的對象數(shù)量及大小。執(zhí)行命令: jmap -histo 3331

num     #instances         #bytes  class name
編號     個(gè)數(shù)                字節(jié)     類名
----------------------------------------------
   1:             7        1322080  [I
   2:          5603         722368  <methodKlass>
   3:          5603         641944  <constMethodKlass>
   4:         34022         544352  java.lang.Integer
   5:           371         437208  <constantPoolKlass>
   6:           336         270624  <constantPoolCacheKlass>
   7:           371         253816  <instanceKlassKlass>

將內(nèi)存使用的詳細(xì)情況輸出到文件酷勺,執(zhí)行命令: jmap -dump:format=b,file=heapDump 6900

然后用jhat命令可以參看 jhat -port 5000 heapDump 在瀏覽器中訪問:http://localhost:5000/ 查看詳細(xì)信息

這個(gè)命令執(zhí)行本橙,JVM會(huì)將整個(gè)heap的信息dump寫入到一個(gè)文件,heap如果比較大的話脆诉,就會(huì)導(dǎo)致這個(gè)過程比較耗時(shí)甚亭,并且執(zhí)行的過程中為了保證dump的信息是可靠的,所以會(huì)暫停應(yīng)用击胜。

總結(jié)

1.如果程序內(nèi)存不足或者頻繁GC亏狰,很有可能存在內(nèi)存泄露情況,這時(shí)候就要借助Java堆Dump查看對象的情況偶摔。
2.要制作堆Dump可以直接使用jvm自帶的jmap命令
3.可以先使用jmap -heap命令查看堆的使用情況暇唾,看一下各個(gè)堆空間的占用情況。
4.使用jmap -histo:[live]查看堆內(nèi)存中的對象的情況。如果有大量對象在持續(xù)被引用策州,并沒有被釋放掉嘲叔,那就產(chǎn)生了內(nèi)存泄露,就要結(jié)合代碼抽活,把不用的對象釋放掉。
5.也可以使用 jmap -dump:format=b,file=<fileName>命令將堆信息保存到一個(gè)文件中锰什,再借助jhat命令查看詳細(xì)內(nèi)容
6.在內(nèi)存出現(xiàn)泄露下硕、溢出或者其它前提條件下,建議多dump幾次內(nèi)存汁胆,把內(nèi)存文件進(jìn)行編號歸檔梭姓,便于后續(xù)內(nèi)存整理分析。

出現(xiàn)問題:

  1. Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can’t attach to the process
    在ubuntu中第一次使用jmap會(huì)報(bào)錯(cuò):Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process嫩码,這是oracla文檔中提到的一個(gè)bug:http://bugs.java.com/bugdatabase/view_bug.do?bug_id=7050524,解決方式如下:
  • echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope 該方法在下次重啟前有效誉尖。

  • 永久有效方法 sudo vi /etc/sysctl.d/10-ptrace.conf 編輯下面這行: kernel.yama.ptrace_scope = 1 修改為: kernel.yama.ptrace_scope = 0 重啟系統(tǒng),使修改生效铸题。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末铡恕,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子丢间,更是在濱河造成了極大的恐慌探熔,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件烘挫,死亡現(xiàn)場離奇詭異诀艰,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)饮六,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門其垄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人卤橄,你說我怎么就攤上這事绿满。” “怎么了窟扑?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵棒口,是天一觀的道長。 經(jīng)常有香客問我辜膝,道長无牵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任厂抖,我火速辦了婚禮茎毁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己七蜘,他們只是感情好谭溉,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著橡卤,像睡著了一般扮念。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上碧库,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天柜与,我揣著相機(jī)與錄音,去河邊找鬼嵌灰。 笑死弄匕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的沽瞭。 我是一名探鬼主播迁匠,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼驹溃!你這毒婦竟也來了城丧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤豌鹤,失蹤者是張志新(化名)和其女友劉穎芙贫,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體傍药,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡磺平,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拐辽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拣挪。...
    茶點(diǎn)故事閱讀 38,137評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖俱诸,靈堂內(nèi)的尸體忽然破棺而出菠劝,到底是詐尸還是另有隱情,我是刑警寧澤睁搭,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布赶诊,位于F島的核電站,受9級特大地震影響园骆,放射性物質(zhì)發(fā)生泄漏舔痪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一锌唾、第九天 我趴在偏房一處隱蔽的房頂上張望锄码。 院中可真熱鬧夺英,春花似錦、人聲如沸滋捶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽重窟。三九已至载萌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間巡扇,已是汗流浹背扭仁。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留霎迫,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓帘靡,卻偏偏與公主長得像知给,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子描姚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評論 2 345

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

  • jstack-- 如果java程序崩潰生成core文件涩赢,jstack工具可以用來獲得core文件的java sta...
    not_null閱讀 7,947評論 2 62
  • (一)相遇 記得那年的夏天特別熱,蟬鳴聒噪轩勘。我和他就是相遇在這樣的夏天筒扒,縱使風(fēng)扇不停地轉(zhuǎn)動(dòng)著,仍抵擋不住熱浪襲...
    72544c5f295b閱讀 190評論 0 1
  • 故事的主角叫林育信,從上小學(xué)考試迷上體操澄步,體操是一項(xiàng)費(fèi)力不討好的職業(yè)冰蘑,在那個(gè)年代,80-90年代村缸,國家也沒有重視這...
    Sophie12138閱讀 446評論 0 0
  • 我常和朋友們提及祠肥,以前有份工作的JD對我影響很大,因?yàn)樗_始的要求是:驅(qū)動(dòng)流程梯皿。這個(gè)讓我受益良多仇箱,告訴我不能只是等...
    付小江閱讀 202評論 0 1
  • 我曾經(jīng)描述過剂桥, 每天最幸福的時(shí)光: 早上我們一起醒來然后一起出門在樓下的包子店買早餐你送我到車站我們各自上班 我和...
    古小也閱讀 397評論 0 0