** 本文中使用到的JDK 為 Oracle JDK 1.7 **
JDK本身提供了很多方便的JVM性能調優(yōu)監(jiān)控工具侨嘀,除了jps、jstat起惕、jinfo柜与、jmap、jhat悄蕾、jstack等小巧的工具湾揽,還有集成式的jvisualvm和jconsole。
這些工具在 $JAVA_HOME/bin目錄下:
jps
jps(JVM Process Status Tool笼吟,虛擬機進程監(jiān)控工具),這個命令可以列出正在運行的虛擬機進程霸旗,并顯示虛擬機執(zhí)行主類名稱贷帮,以及這些進程的本地虛擬機唯一ID。這個ID被稱為本地虛擬機唯一ID(local virtual Machine Identifier诱告,簡寫為LVMID)撵枢。如果你在linux的一臺服務器上使用jps得到的LVMID其實就是和ps 命令得到的PID是一樣的。
語法格式如下:
jps [options] [hostid]
如果不指定hostid就默認為當前主機或服務器精居。
options參數(shù)選項說明如下:
-q 不輸出類名锄禽、Jar名和傳入main方法的參數(shù)
-m 輸出傳入main方法的參數(shù)
-l 輸出main類或Jar的全限名
-v 輸出傳入JVM的參數(shù)
使用
1、查看所有java進程
jps -lv
jinfo
jinfo (Configuration Info for Java靴姿,配置信息工具)
這個命令可以實時地查看和調整虛擬機各項參數(shù)沃但。
主要參數(shù)如下:
使用
1、查看2788的MaxPerm大小可以用
jinfo -flag MaxPermSize 2788
輸出結果:
[root@Bill-8 bin]# jinfo -flag MaxPermSize 577
-XX:MaxPermSize=134217728
jhat
jhat(虛擬機堆轉儲快照分析工具)佛吓,這個工具是用來分析jmap dump出來的文件宵晚。
由于這個工具功能比較簡陋垂攘,運行起來也比較耗時,所以這個工具不推薦使用淤刃,推薦使用MAT晒他。
例如分析dump出來的test.bin,命令如下:
jhat test.bin
它會在本地啟動一個web服務逸贾,端口是7000陨仅,這樣直接訪問 127.0.0.1:7000就能看到分析結果了。
jmap
jmap(Memory Map for Java铝侵,內存映像工具)灼伤,用于生成堆轉存的快照,一般是heapdump或者dump文件哟沫。如果不適用jmap命令饺蔑,可以使用-XX:+HeapDumpOnOutOfMemoryError參數(shù),當虛擬機發(fā)生內存溢出的時候可以產生快照嗜诀』或者使用kill -3 pid也可以產生。jmap的作用并不僅僅是為了獲取dump文件隆敢,它可以查詢finalize執(zhí)行隊列发皿,java堆和永久代的詳細信息,如空間使用率拂蝎,當前用的哪種收集器穴墅。
jmap的命令格式:
jmap [option] vmid
主要參數(shù)如下:
option參數(shù)說明:
- -dump:[live,]format=b,file=<filename> 使用hprof二進制形式,輸出jvm的heap內容到文件=. live子選項是可選的,假如指定live選項,那么只輸出活的對象到文件.
- -finalizerinfo 打印正等候回收的對象的信息.
- -heap 打印heap的概要信息温自,GC使用的算法玄货,heap的配置及wise heap的使用情況.
- -histo[:live] 打印每個class的實例數(shù)目,內存占用,類全名信息. VM的內部類名字開頭會加上前綴”*”. 如果live子參數(shù)加上后,只統(tǒng)計活的對象數(shù)量.
- -permstat 打印classload和jvm heap長久層的信息. 包含每個classloader的名字,活潑性,地址,父classloader和加載的class數(shù)量. 另外,內部String的數(shù)量和占用內存數(shù)也會打印出來.
- -F 強迫.在pid沒有相應的時候使用-dump或者-histo參數(shù). 在這個模式下,live子參數(shù)無效.
- -h | -help 打印輔助信息
- -J 傳遞參數(shù)給jmap啟動的jvm.
64位機上使用需要使用如下方式:
jmap -J-d64 -heap pid
使用
1、打印每個class的實例數(shù)目,內存占用,類全名信息
jmap -histo 577
2悼泌、dump heap內容到文件
jmap -dump:format=b,file=test.bin 577
jstat
jstat(JVM Statistics Monitoring Tool松捉,虛擬機統(tǒng)計信息監(jiān)視工具),這個命令用于監(jiān)視虛擬機各種運行狀態(tài)信息馆里。它可以顯示本地或者遠程虛擬機進程中的類裝載隘世、內存、垃圾收集鸠踪、JIT編譯等運行數(shù)據丙者,雖然沒有GUI圖形界面,只是提供了純文本控制臺環(huán)境的服務器上营密,但它是運行期間定位虛擬機性能問題的首選工具械媒。
語法格式如下:
jstat [option vmid [interval [s | ms] [count ] ] ]
vmid是Java虛擬機ID,在Linux/Unix系統(tǒng)上一般就是進程ID评汰。interval是采樣時間間隔滥沫。count是采樣數(shù)目侣集。
jstat的參數(shù)說明如下(截圖來自周志明的《深入理解Java虛擬機 第二版》):
使用
例如:需要每250毫秒查詢一次進程2849 垃圾收集狀況,一共查詢20次兰绣,那命令如下:
jstat -gc 2849 250 20
jstack
jstack(Java Stack Trace世分,Java堆棧跟蹤工具),這個命令用于查看虛擬機當前時刻的線程快照(一般是threaddump 或者 javacore文件)缀辩。線程快照就是當前虛擬機內每一條線程正在執(zhí)行的方法堆棧的集合臭埋。生成線程快照的主要目的是定位線程出現(xiàn)長時間停頓的原因,入線程間死鎖臀玄、死循環(huán)瓢阴、請求外部資源導致的長時間等待都是導致線程長時間停頓的常見原因。線程出現(xiàn)停頓的時候通過jstack來查看各個線程的調用堆棧健无,就可以知道沒有響應的線程到底在后臺做些什么事情荣恐。
命令格式:
jstack [option] vmid
主要的option如下:
使用
1、查看進程2849 的堆棧信息
[root@Bill-8 yrd_soft]# jstack 2849
jconsole
jconsole:一個java GUI監(jiān)視工具累贤,可以以圖表化的形式顯示各種數(shù)據叠穆。并可通過遠程連接監(jiān)視遠程的服務器VM。用java寫的GUI程序臼膏,用來監(jiān)控VM硼被,并可監(jiān)控遠程的VM,非常易用渗磅,而且功能非常強嚷硫。命令行里打 jconsole,選則進程就可以了始鱼。
啟動:
概覽
內存
線程:
類:
VM概要:
jvisualvm
jvisualvm同jconsole都是一個基于圖形化界面的仔掸、可以查看本地及遠程的JAVA GUI監(jiān)控工具,Jvisualvm同jconsole的使用方式一樣医清,直接在命令行打入jvisualvm即可啟動起暮,jvisualvm界面更美觀一些,數(shù)據更實時:
監(jiān)控:
線程監(jiān)控:
參考資料
周志明 《深入理解Java虛擬機 第二版》