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

[root@localhost ~]# 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信息:

 

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就可以開始監控了。

 



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章