JVM 性能調優監控工具

企業級應用開發中常常會遇到如下問題,可使用工具對JVM進行監管,以便及時查找問題所在。
  內存不足OutOfMemory(大對象沒有gc等),內存泄露;
  線程死鎖,線程數過多;
  鎖爭用(Lock Contention),資源未及時釋放(數據庫);
  Java進程CPU消耗太高.html

1、Java自帶工具java

  Java安裝目錄的bin文件加下有一些工具能夠用來監控JVM性能,如jconsole、jvisualvm、jmap、jps、jstack、jhat、jstat等。git

1.   jconsolegithub

  jconsole能夠監控Java應用程序(如jar應用、tomcat等),但被監視的應用程序必須和jconsole是用同一個用戶運行的。jvisualvm的使用和jconsole相似。算法

  • 本地監控:  jconsole  pid 
  • 遠程監控:  jconsole  [ hostname:portNum ]      

      使用遠程監控須要配置jmx代理信息,修改Tomcat的bin目錄下的catalina.bat。數據庫

set JAVA_OPTS= %JAVA_OPTS% -Djava.rmi.server.hostname=HostIP set JAVA_OPTS= %JAVA_OPTS% -Dcom.sun.management.jmxremote.port=8888 set JAVA_OPTS= %JAVA_OPTS% -Dcom.sun.management.jmxremote.ssl=false set JAVA_OPTS= %JAVA_OPTS% -Dcom.sun.management.jmxremote.authenticate=false

  鏈接成功後能夠在overview中查看內存、線程、類及CPU使用狀況:瀏覽器

      

2.  probetomcat

  Lambda Probe 是基於 Web + AJAX 的強大的免費開源工具,能夠用來實時管理一個單獨的host。LambdaProbe擁有幾乎全部Tomcat Manager的功能,還包括應用程序、數據源、發佈、日誌、線程、集羣、系統信息、狀態、鏈接器狀態這些功能,並能顯示 Server 的詳細內存佔用狀態。eclipse

  probe war包下載jvm

3.   jmap

   打印java進程的堆內存信息。

  • jmap -heap pid         查看heap的概要信息,GC使用的算法、heap的配置及wise heap的使用狀況.
  • jmap -histo[:live] pid     查看堆內存中的每一個類的類名、實例數量、內存佔用大小
  • jmap -dump:live, format=b, file=fileName pid       將內存使用狀況導出到文件中,再用jhat、MAT、VisualVM分析查看,以便查找內存溢出緣由

4. jhat

  jhat能夠對JVM中導出的文件進行分析,使用命令 jhat fileName 便可以在瀏覽器中輸入http://localhost:7000查看內存信息。若是Dump文件太大須要加上-J-Xmx512m指定最大堆內存,如 jhat -J-Xmx512m [-port 9998] tmp.bin

  分析內存還可使用Eclipse的Memory Analyzer,插件地址http://download.eclipse.org/releases/juno,找到General Purpose Tools底下的Memory Analyzer並安裝。

5. jstat

  查看classloader,compiler,gc相關信息,實時監控資源和性能 。jstat工具特別強大,能夠用來監視VM內存內的各類堆和非堆的大小及其內存使用量。

語法結構:

       jstat -<option> [-t] [-h<lines>] <pid> [<interval> [<count>]]

Options — 一般使用 -gcutil 查看gc狀況
interval – 間隔時間,單位爲秒或者毫秒
count — 打印次數,若是缺省則打印無數次

結果說明:

S0     — Heap上的 Survivor space 0 區已使用空間的百分比
S1     — Heap上的 Survivor space 1 區已使用空間的百分比
E       — Heap上的 Eden space 區已使用空間的百分比
O      — Heap上的 Old space 區已使用空間的百分比
P       — Perm space 區已使用空間的百分比
YGC  — 從應用程序啓動到採樣時發生 Young GC 的次數
YGCT— 從應用程序啓動到採樣時 Young GC 所用的時間(單位秒)
FGC  — 從應用程序啓動到採樣時發生 Full GC 的次數
FGCT— 從應用程序啓動到採樣時 Full GC 所用的時間(單位秒)
GCT  — 從應用程序啓動到採樣時用於垃圾回收的總時間(單位秒)

  • jstat –class<pid> :          顯示加載class的數量,及所佔空間等信息。
  • jstat -compiler <pid>:    顯示VM實時編譯的數量等信息。
  • jstat -gc <pid>:              顯示gc的信息,查看gc的次數,及時間。
  • jstat -gccapacity <pid>: 顯示VM內存中三代(young,old,perm)對象的使用和佔用大小
  • jstat -gcutil <pid>:         統計gc信息
  • jstat -gcnew / gcnewcapacity<pid>: 年輕代對象的信息(及其佔用量)。
  • jstat -gcold / gcoldcapacity <pid> :old代對象的信息(及其佔用量)。
  • jstat -gcpermcapacity  <pid>:            perm對象的信息及其佔用量。
  • jstat -printcompilation <pid>:            當前VM執行的信息。

6. jstack

  jstack用於生成java虛擬機當前時刻的線程快照,主要目的是定位線程出現長時間停頓的緣由,如線程間死鎖、死循環、請求外部資源致使的長時間等待等。

語法:  jstack [ option ] pid

    -F 當 jstack [-l] pid 沒有響應的時候強制打印棧信息
    -l 長列表. 打印關於鎖的附加信息,例如屬於java.util.concurrent的ownable synchronizers列表.
 
 

7. jps

用來查看基於HotSpot JVM裏面全部進程的具體狀態, 包括進程ID,進程啓動的路徑等等。

      命令格式:jps [options ] [ hostid ] 

[options]選項 :
-q: 輸出VM標識符pid
-m:輸出main method的參數 
-l:  輸出徹底的包名,應用主類名,jar的徹底路徑名 
-v: 輸出jvm參數 
-V: 輸出經過flag文件傳遞到JVM中的參數
-Joption:傳遞參數到vm,例如:-J-Xms512m

        [hostid]:[protocol:][[//]hostname][:port][/servername]

相關文章
相關標籤/搜索