天天看點

JVM監控指令和可視化監控工具

1 JVM監控指令

jps、jstack、jmap、jinfo、jstat

1.1 jps

jps主要用來輸出JVM中運作的程序狀态資訊,包括程序ID、程序啟動的路徑等。

Ps -ef | grep java

1.2 jstack

如果想要檢視Java程序中線程堆棧的資訊,可以選擇jstack。

用于生成目前JVM的所有線程快照,線程快照是虛拟機每一條線程正在執行的方法,目的是 定位線程長時間停頓的原因,比如線程間死鎖、死循環、請求外部資源導緻的長時間等待。

   -F:當正常輸出的請求不被響應時,強制輸出線程堆棧

   -l:除堆棧外,顯示關于鎖的附加資訊

   -m:如果調用到本地方法的話,可以顯示C/C++的堆棧

Jstack可以定位到線程堆棧,根據堆棧資訊我們可以定位到具體代碼,是以在JVM性能調優中使用非常多。

步驟:

1、找出Java程序ID。

ps -ef | grep [伺服器上的Java應用名稱] | grep -v grep

(grep -v grep是指過濾掉含有grep字元的行)

Eg:ps -ef | grep App

[[email protected] ~]# ps -ef | grep ApacheJetspeed

root     18887 18828  0 08:09  pts/0    00:00:00 grep ApacheJetspeed

字段含義如下:

UID     PID    PPID  C  STIME   TTY           TIME     CMD

root    18887  18828   0  08:09     pts/0    00:00:00    grep ApacheJetspeed

ps:将某個程序顯示出來

-A  顯示所有程式。

-e  此參數的效果和指定"A"參數相同。

-f  顯示UID,PPIP,C與STIME欄位。

    grep指令是查找

    中間的|是管道指令 是指ps指令與grep同時執行

    這條指令的意思是顯示有關Apachejetspeed有關的程序

    各相關資訊的意義:

    UID 程式被該 UID 所擁有;PID 就是這個程式的 ID ;PPID 則是其上級父程式的ID;C CPU 使用的資源百分比;STIME 系統啟動時間;TTY 登入者的終端機位置;TIME 使用掉的 CPU 時間;CMD 所下達的指令為何

2、找出該程序内最耗費CPU的線程。

top -Hp pid

其中,TIME列就是各個Java線程耗費的CPU時間。

3、輸出線程的堆棧資訊,然後根據線程ID的十六進制值grep。

jstack [線程ID] | grep [線程ID的16進制值]

根據列印資訊,就可以判斷看到CPU消耗在哪個類的哪個方法上。

遺留問題

 Unable to open socket file: target process not responding or HotSpot VM not loaded

The -F option can be used when the target process is not responding。

無法打開套接字檔案:目标程序未響應或熱點虛拟機未加載。當目标程序沒有響應時,可以使用f選項。

加入-F後報錯:get_thread_regs failed for a lwp

1.3 jmap

  jmap(Memory Map)和 jhat(Java Heap Analysis Tool):jmap導出堆記憶體,然後使用jhat來進行分析。

1、檢視程序堆記憶體使用情況:包括使用的GC算法、堆配置參數和各代中堆記憶體使用:

jmap -heap [程序ID]

2、檢視堆記憶體中的對象數目、大小統計直方圖,如果帶上live則隻統計活對象:

jmap -histo[:live] [程序ID]

3、用jmap把程序記憶體使用情況dump到檔案中,再用jhat分析檢視。需要注意的是 dump出來的檔案還可以用MAT、VisualVM等工具檢視。

導出堆:jmap -dump:format=b,file=dumpFileName[檔案名]  [程序ID]

分析堆檔案:jhat /home/weblogic/dumpFileName

檢視HTML:http://localhost:7000 遠端的話是:http://遠端IP:7000]

HTML頁面中顯示堆中所包含的所有類(All classes excluding 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.4 jinfo

主要用于檢視指定Java程序(或核心檔案、遠端調試伺服器)的Java配置資訊。

1.5 jstat

jstat(JVM統計監測工具): 看看各個區記憶體和GC的情況。文法格式如下:

jstat -gc 2860[程序ID] 250[采樣時間間隔250ms] 6[采樣數]

下面輸出的是GC資訊:

JVM監控指令和可視化監控工具

S0C、S1C、S0U、S1U:Survivor 0/1區容量(Capacity)和使用量(Used)  

EC、EU:Eden區容量和使用量  

OC、OU:年老代容量和使用量  

PC、PU:永久代容量和使用量  

YGC、YGT:年輕代GC次數和GC耗時  

FGC、FGCT:Full GC次數和Full GC耗時  

GCT:GC總耗時

2 JVM可視化監控工具

  JConsole、visualVM

2.1 JConsole

JConsole工具在JDK/bin目錄下,啟動JConsole後,将自動搜尋本機運作的jvm程序,不需要jps指令來查詢指定。輕按兩下其中一個jvm程序即可開始監控,也可使用“遠端程序”來連接配接遠端伺服器。

進入JConsole主界面,有”概覽”、”記憶體”、”線程”、”類”、”VM概要”、”MBean”六個頁簽。

“記憶體”:相當于jstat指令,用于監視收集器管理的虛拟機記憶體(Java堆和永久代)變化趨勢,還可在詳細資訊欄觀察全部GC執行的時間及次數。

“VM概要”:顯示指定的JVM參數及堆資訊。

2.2 visualVM

自JDK 6 Update 7以後,提供了一全新的性能檢測工具:VisualVM,VisualVM對運作中的Java應用提供了可視化的資訊展示, 它是很多工具的整合包,整合了JConsole,jstat,jinfo,jstack以及jmap。

1、簡介

VisualVM 是一款免費的\內建了多個 JDK 指令行工具的可視化工具,它能為您提供強大的分析能力,對Java 應用程式做性能分析和調優。這些功能包括生成和分析海量資料、跟蹤記憶體洩漏、監控垃圾回收器、執行記憶體和 CPU 分析,同時它還支援在 MBeans 上進行浏覽和操作。它通過 jvmstat、JMX、SA(Serviceability Agent)以及 Attach API 等多種方式從程式運作時獲得實時資料,進而進行動态的性能分析。同時,它能自動選擇更快更輕量級的技術盡量減少性能分析對應用程式造成的影響,提高性能分析的精度。

開發大型 Java 應用程式的過程中難免遇到記憶體洩露、性能瓶頸等問題,比如檔案、網絡、資料庫的連接配接未釋放,未優化的算法等。随着應用程式的持續運作,可能會造成整個系統運作效率下降,嚴重的則會造成系統崩潰。為了找出程式中隐藏的這些問題,在項目開發後期往往會使用性能分析工具來對應用程式的性能進行分析和優化。

2、性能分析的主要方式

監視:監視是一種用來檢視應用程式運作時行為的一般方法。通常會有多個視圖(View)分别實時地顯示 CPU 使用情況、記憶體使用情況、線程狀态以及其他一些有用的資訊,以便使用者能很快地發現問題的關鍵所在。

轉儲:性能分析工具從記憶體中獲得目前狀态資料并存儲到檔案用于靜态的性能分析。Java 程式是通過在啟動 Java 程式時添加适當的條件參數來觸發轉儲操作的。

系統存儲:JVM生成的本地系統的轉儲,又稱為核心轉儲。一般系統轉儲資料量大,需要平台相關的工具去分析,如Windows 上的 windbg 和 Linux 上的 gdb。

Java 轉儲:JVM 内部生成的格式化後的資料,包括線程資訊,類的加載資訊以及堆的統計資料。通常也用于檢測死鎖。

堆轉儲:JVM 将所有對象的堆内容存儲到檔案。

快照:應用程式啟動後,性能分析工具開始收集各種運作時資料,其中一些資料直接顯示在監視視圖中,而另外大部分資料被儲存在内部,直到使用者要求擷取快照,基于這些儲存的資料的統計資訊才被顯示出來。快照包含了應用程式在一段時間内的執行資訊,通常有 CPU 快照和記憶體快照兩種類型。

CPU 快照:主要包含了應用程式中函數的調用關系及運作時間,這些資訊通常可以在 CPU 快照視圖中進行檢視。

記憶體快照:主要包含了記憶體的配置設定和使用情況、載入的所有類、存在的對象資訊及對象間的引用關系等。這些資訊通常可以在記憶體快照視圖中進行檢視。

性能分析:性能分析是通過收集程式運作時的執行資料來幫助開發人員定位程式需要被優化的部分,進而提高程式的運作速度或是記憶體使用效率,主要有以下三個方面:

CPU 性能分析:CPU 性能分析的主要目的是統計函數的調用情況及執行時間,或者更簡單的情況就是統計應用程式的 CPU 使用情況。通常有 CPU 監視和 CPU 快照兩種方式來顯示 CPU 性能分析結果。

記憶體性能分析:記憶體性能分析的主要目的是通過統計記憶體使用情況檢測可能存在的記憶體洩露問題及确定優化記憶體使用的方向。通常有記憶體監視和記憶體快照兩種方式來顯示記憶體性能分析結果。

線程性能分析:線程性能分析主要用于在多線程應用程式中确定記憶體的問題所在。一般包括線程的狀态變化情況,死鎖情況和某個線程線上程生命期内狀态的分布情況等。

2.3 Btrace插件監控應用程式

http://blog.csdn.net/lipc_/article/details/52852968

使用jvisualvm.exe 的Btrace插件監控應用程式。能夠線上監控程式狀态,擷取運作時資料資訊,如方法傳回值,參數,調用次數,全局變量,調用堆棧等。

1、在jvisualvm.exe安裝btrace插件

2、使用插件(Trace application)

3、編輯監控代碼,在classpath 中加入 btrace相關的jar包,點選start就可以開始監控了。

繼續閱讀