JVM(三):虛擬機(jī)性能監(jiān)控與故障處理工具

1. JDK監(jiān)控和故障處理工具

在JDK的bin目錄下永票,有很多命令行工具。

名稱 主要作用
jps JVM Process Status Tool肖抱,顯示指定系統(tǒng)內(nèi)所有的HotSpot虛擬機(jī)進(jìn)程
jstat JVM Statistics Monitoring Tool备典,用于收集HotSpot虛擬機(jī)各方面的運行數(shù)據(jù)
jinfo Configuration Info for Java,顯示虛擬機(jī)配置信息
jmap Memory Map for Java意述,生成虛擬機(jī)的內(nèi)存轉(zhuǎn)儲快照(heapdump文件)
jhat JVM Heap Dump Browser,用于分析heapdump文件吮蛹,用戶可在瀏覽器上查看
jstack Stack Trace for Java荤崇,顯示虛擬機(jī)的線程快照
  • jps:虛擬機(jī)進(jìn)程狀況工具
    列出正在運行的虛擬機(jī)進(jìn)程,并顯示虛擬機(jī)執(zhí)行主類(main()函數(shù)所在的類)
    jps [ options ] [ hostid ]
選項 作用
-q 只輸出LVMID潮针,省略主類的名稱
-m 輸出虛擬機(jī)進(jìn)程啟動時傳遞給主類main()函數(shù)的參數(shù)
-l 輸出主類的全名术荤,如果進(jìn)程執(zhí)行的是jar包,則輸出jar路徑
-v 輸出虛擬機(jī)進(jìn)程啟動時JVM參數(shù)
  • jstat:虛擬機(jī)統(tǒng)計信息監(jiān)視工具
    顯示本地或遠(yuǎn)程虛擬機(jī)進(jìn)程中的類裝載每篷、內(nèi)存瓣戚、垃圾收集、JIT編譯等運行數(shù)據(jù)焦读。
    jstat [ option vmid [interval[s|ms] [count]] ]
選項 作用
-class 監(jiān)視類裝載子库、卸載數(shù)量、總空間以及類裝載所耗費時間
-gc 監(jiān)視Java堆狀況矗晃,包括Eden仑嗅、Survivor、Old张症、Permanent等容量仓技、GC信息
-gccapacity 與-gc基本相同,主要關(guān)注Java堆各區(qū)域使用的最大俗他、最小空間
-gcutil 與-gc基本相同脖捻,主要關(guān)注已使用空間占總空間的百分比
-gccause 與-gcutil基本相同,會輸出導(dǎo)致上一次GC的原因
-gcnew 監(jiān)視新生代GC狀況
-gcnewcapacity 與-gcnew基本相同兆衅,主要關(guān)注使用的最大地沮、最小空間
-gcold 監(jiān)視老年代GC狀況
-gcoldcapacity 與-gcold基本相同嗜浮,主要關(guān)注使用的最大、最小空間
-gcpermcapacity 永久代使用的最大诉濒、最小空間
-compiler 輸出JIT編譯器編譯過的方法周伦、耗時等信息
-printcompilation 輸出已經(jīng)被JIT編譯的方法
  • jinfo:Java配置信息工具
    實時查看和調(diào)整虛擬機(jī)各項參數(shù)。
    jinfo [ options] pid
選項 作用
-flag 查看虛擬機(jī)各項參數(shù)(包括默認(rèn)參數(shù)值)
-sysprops 打印虛擬機(jī)進(jìn)程的System.getProperties()的內(nèi)容
  • jmap:Java內(nèi)存映像工具
    用于生成堆轉(zhuǎn)儲快照未荒。
    jmap [ options ] vmid
選項 作用
-dump 生成Java堆轉(zhuǎn)儲快照
-finalizerinfo 顯示在F-Queue中等待Finalizer線程執(zhí)行finalize方法的對象
-heap 顯示Java堆詳細(xì)信息专挪,如使用哪種回收器、參數(shù)配置片排、分代狀況等
-histo 顯示堆中對象統(tǒng)計信息寨腔,包括類、實例數(shù)量率寡、合計容量
-permstat 以ClassLoader為統(tǒng)計口徑顯示永久代內(nèi)存狀態(tài)
-F 當(dāng)虛擬機(jī)進(jìn)程對-dump選項沒有響應(yīng)時迫卢,強制生成dump快照
  • jhat:虛擬機(jī)堆轉(zhuǎn)儲快照分析工具
    與jmap搭配使用,用于分析dump文件冶共。
    一般不用此工具乾蛤。
  • jstack:Java堆棧跟蹤工具
    用于生成虛擬機(jī)當(dāng)前時刻的線程快照,主要用于定位線程出現(xiàn)長時間停頓的原因捅僵。
    jstack [ options ] vmid
選項 作用
-F 當(dāng)正常輸出請求不被響應(yīng)時家卖,強制輸出線程堆棧快照
-l 除堆棧外庙楚,還顯示關(guān)于鎖的信息
-m 如果調(diào)用到本地方法上荡,顯示C/C++的堆棧
  • HSDIS:JIT生成代碼反匯編
    HSDIS是一個HotSpot虛擬機(jī)JIT編譯代碼的反匯編插件,可下載馒闷。
    該插件的作用是讓HotSpot的-XX:+PrintAssembly指令調(diào)用它來把動態(tài)生成的本地代碼還原為匯編代碼輸出酪捡,同時還生成大量注釋。

2. JDK可視化工具

VisualVM是一款可視化虛擬機(jī)故障處理工具纳账。功能有:

  • 顯示虛擬機(jī)進(jìn)程以及進(jìn)程的配置逛薇、環(huán)境信息(jps、jinfo)
  • 監(jiān)視應(yīng)用程序的CPU塞祈、GC金刁、堆、方法區(qū)以及線程的信息(jstat议薪、jstack)
  • dump以及分析堆轉(zhuǎn)儲快照(jmap尤蛮、jhat)
  • 方法級的程序運行性能分析,找出被調(diào)用最多斯议、運行時間最長的方法
  • 離線程序快照:收集程序的運行時配置产捞、線程dump、內(nèi)存dump等信息建立一個快照哼御,快照可發(fā)送

3. 內(nèi)存泄露

無用的對象無法被垃圾回收坯临,一直占著內(nèi)存空間焊唬,就會出現(xiàn)內(nèi)存泄露,例如一個長生命周期對象長期持有短生命周期對象看靠,就可能出現(xiàn)內(nèi)存泄露赶促。
內(nèi)存一直泄露,就會導(dǎo)致內(nèi)存溢出挟炬。

JVM設(shè)置:-Xms10m -Xmx10m

public class MemoryLeakBean {
    private final byte[] arr = new byte[1024];
}


public class MemoryLeak {
    public static void main(String[] args) throws InterruptedException {
        Set<MemoryLeakBean> set = new HashSet<>();
        while (true) {
            MemoryLeakBean bean = new MemoryLeakBean();
            set.add(bean);
            Thread.sleep(10);
        }
    }
}

程序運行時出現(xiàn):


從VisualVM中看鸥滨,YGC執(zhí)行了5次,F(xiàn)GC執(zhí)行了4次谤祖,但是FGC后老年代使用內(nèi)存空間并沒有減少婿滓,說明老年代中對象還一直存活,無法被回收粥喜。


從堆dump中看凸主,MemoryLeakBean實例數(shù)為2352個。


從堆dump中看额湘,MemoryLeakBean實例數(shù)為5631個卿吐,該對象被一直創(chuàng)建,且沒有被回收锋华。


此時內(nèi)存已經(jīng)溢出但两,出現(xiàn)異常:Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市供置,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌绽快,老刑警劉巖芥丧,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異坊罢,居然都是意外死亡续担,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進(jìn)店門活孩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來物遇,“玉大人,你說我怎么就攤上這事憾儒⊙耍” “怎么了?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵起趾,是天一觀的道長诗舰。 經(jīng)常有香客問我,道長训裆,這世上最難降的妖魔是什么眶根? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任蜀铲,我火速辦了婚禮,結(jié)果婚禮上属百,老公的妹妹穿的比我還像新娘记劝。我一直安慰自己,他們只是感情好族扰,可當(dāng)我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布厌丑。 她就那樣靜靜地躺著,像睡著了一般别伏。 火紅的嫁衣襯著肌膚如雪蹄衷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天厘肮,我揣著相機(jī)與錄音愧口,去河邊找鬼。 笑死类茂,一個胖子當(dāng)著我的面吹牛耍属,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播巩检,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼厚骗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了兢哭?” 一聲冷哼從身側(cè)響起领舰,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎迟螺,沒想到半個月后冲秽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡矩父,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年锉桑,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窍株。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡民轴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出球订,到底是詐尸還是另有隱情后裸,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布辙售,位于F島的核電站轻抱,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏旦部。R本人自食惡果不足惜祈搜,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一较店、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧容燕,春花似錦梁呈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至醋虏,卻和暖如春寻咒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背颈嚼。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工毛秘, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人阻课。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓叫挟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親限煞。 傳聞我的和親對象是個殘疾皇子抹恳,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,860評論 2 361

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