JVM調(diào)優(yōu)工具
1丙躏、JVM調(diào)優(yōu)工具-JDK工具
1.1 jps
jps:Java Virtual Machine Process Status Tool
查看java進(jìn)程哲嘲,相當(dāng)于Linux下的ps命令嫌变,只不過(guò)它只能列出Java進(jìn)程
jps:列出Java程序進(jìn)程的ID和Main函數(shù)名稱(chēng)
jps -q: 只輸出集成ID
jps -m: 輸出傳遞給Java進(jìn)程(主函數(shù))的參數(shù)
jps -l: 輸出主函數(shù)的完整路徑
jps -v: 顯示傳遞給Java虛擬的參數(shù)
1.2 jstat
jstat:JVM Statistics Monitoring Tool jvm信息統(tǒng)計(jì)監(jiān)控工具
jstat可以查看Java程序運(yùn)行時(shí)相關(guān)信息响禽,可以通過(guò)它查看堆信息的相關(guān)情況
jstat -<option> [-t] [-h<lines>] <vmid> [<interval>] [<count>]
options:由以下值構(gòu)成
- class (類(lèi)加載器)
- compiler (JIT)
- gc (GC堆狀態(tài))
- gccapacity (各區(qū)大小)
- gccause (最近一次GC統(tǒng)計(jì)和原因)
- gcnew (新區(qū)統(tǒng)計(jì))
- gcnewcapacity (新區(qū)大小)
- gcold (老區(qū)統(tǒng)計(jì))
- gcoldcapacity (老區(qū)大小)
- gcpermcapacity (永久區(qū)大小)
- gcutil (GC統(tǒng)計(jì)匯總)
- printcompilation (HotSpot編譯統(tǒng)計(jì))
- interval(用于指定輸出統(tǒng)計(jì)數(shù)據(jù)的周期俩滥,單位是毫秒)
- count(用于指定一個(gè)輸出多少次數(shù)據(jù))
示例1
下面輸出的GC信息嘉蕾,10416:進(jìn)程ID 250:250毫秒 4:采樣本數(shù)為4次
jstat -gc 10416 250 4
具體描述
S0C:年輕代中第一個(gè)survivor(幸存區(qū))的容量 (字節(jié))
S1C:年輕代中第二個(gè)survivor(幸存區(qū))的容量 (字節(jié))
S0U:年輕代中第一個(gè)survivor(幸存區(qū))目前已使用空間 (字節(jié))
S1U:年輕代中第二個(gè)survivor(幸存區(qū))目前已使用空間 (字節(jié))
EC :年輕代中Eden(伊甸園)的容量 (字節(jié))
EU :年輕代中Eden(伊甸園)目前已使用空間 (字節(jié))
OC :Old代的容量 (字節(jié))
OU :Old代目前已使用空間 (字節(jié))
PC :Perm(持久代)的容量 (字節(jié))
PU :Perm(持久代)目前已使用空間 (字節(jié))
YGC:從應(yīng)用程序啟動(dòng)到采樣時(shí)年輕代中g(shù)c次數(shù)
YGCT:從應(yīng)用程序啟動(dòng)到采樣時(shí)年輕代中g(shù)c所用時(shí)間(s)
FGC :從應(yīng)用程序啟動(dòng)到采樣時(shí)old代(全gc)gc次數(shù)
FGCT:從應(yīng)用程序啟動(dòng)到采樣時(shí)old代(全gc)gc所用時(shí)間(s)
GCT :從應(yīng)用程序啟動(dòng)到采樣時(shí)gc用的總時(shí)間(s)
示例2
jstat -calss 10416
具體描述:
loaded:已經(jīng)裝在的類(lèi)的數(shù)量
Bytes :裝載類(lèi)所占用的字節(jié)數(shù)
Unloaded:已經(jīng)卸載類(lèi)的數(shù)量
Bytes:卸載類(lèi)的字節(jié)數(shù)
示例3
jstat -gcutil 10416 5s 5
1.3 jinfo
jinfo:Java configuration info
jinfo可以用來(lái)查看正在運(yùn)行的java程序的擴(kuò)展參數(shù),甚至支持運(yùn)行時(shí)霜旧,修改部分參數(shù)
jinfo [option] <pid>
1.4 jmap
jmap:Java Memory Map
jmap用來(lái)查看堆內(nèi)存使用狀況错忱,一般結(jié)合jhat使用
示例1 heap
命令:jmap -heap pid
描述:顯示Java堆詳細(xì)信息
打印一個(gè)堆的摘要信息,包括使用的GC算法挂据、堆配置信息和各內(nèi)存分配情況
示例2 histo[:live]
命令:jmap -histo:live pid
描述:顯示堆中對(duì)象的統(tǒng)計(jì)信息
其中包括每個(gè)Java類(lèi)以清、對(duì)象數(shù)量、內(nèi)存大衅樘印(單位:字節(jié))掷倔、完全限定的類(lèi)名。打印的虛擬機(jī)內(nèi)部的類(lèi)名稱(chēng)將會(huì)帶有一個(gè)*前綴个绍,如果ja 指定了live子選項(xiàng)勒葱,則只計(jì)算活動(dòng)的對(duì)象
示例3 clstats
命令:jmap -clstats pid
描述:打印類(lèi)加載器信息
示例4 finalizerinfo
命令:jmap -finalizerinfo pid
描述:打印等待終結(jié)的對(duì)象信息
示例5 dump 結(jié)合下面的jhat使用
命令:jmap -dump:format=b,file=heapdump.phrof pid
描述:生成堆轉(zhuǎn)儲(chǔ)快照dump文件
注意
phrof二進(jìn)制格式轉(zhuǎn)儲(chǔ)指定filename的文件中。live子選項(xiàng)是可選的巴柿,如果指定了live子選項(xiàng)凛虽,堆中只有活動(dòng)的對(duì)象會(huì)被轉(zhuǎn)儲(chǔ)。想要瀏覽heap dump广恢,你可以使用jhat(java堆分析工具)讀取生成的文件
這個(gè)命令執(zhí)行凯旋,jvm會(huì)將整個(gè)heap的信息dump寫(xiě)入到一個(gè)文件,heap如果比較大的話钉迷,就會(huì)導(dǎo)致這個(gè)過(guò)程比較耗時(shí)至非,并且執(zhí)行的過(guò)程中為了保證dump的信息是可靠的,所以會(huì)暫停應(yīng)用糠聪,線上系統(tǒng)慎用
1.5 jhat
jhat:java Heap Analysis Tool ,jhat命令解析ajva對(duì)轉(zhuǎn)儲(chǔ)文件睡蟋,并啟動(dòng)一個(gè)web server。然后用瀏覽器來(lái)查看瀏覽dump出來(lái)的heap枷颊。jhat 命令支持預(yù)先設(shè)計(jì)的查詢(xún),比如顯示某個(gè)類(lèi)的所有實(shí)例。還支持查詢(xún)語(yǔ)言(OQL Obejct Query Language)夭苗。OQL有點(diǎn)類(lèi)似Sql信卡,專(zhuān)門(mén)用來(lái)查詢(xún)堆轉(zhuǎn)儲(chǔ)。OQL相關(guān)的幫助信息可以在jhat命令所提供的服務(wù)器頁(yè)面最底部题造,如果使用默認(rèn)端口傍菇,則OQL幫助信息頁(yè)面為:http://localhost:7000/oqlhelp/
1.6 jstack
命令:jstack -l pid > jstack_info.txt
jstack:java Stack Trace,jstack是Java虛擬機(jī)只帶的一種堆棧跟蹤工具界赔。jstack用于生產(chǎn)java虛擬機(jī)當(dāng)前時(shí)刻的線程快照丢习。線程快照是當(dāng)前Java虛擬機(jī)內(nèi)每一條線程正在執(zhí)行的方法堆棧的集合,生成線程快照的主要目的是定位線程出現(xiàn)長(zhǎng)時(shí)間停頓的原因淮悼,如線程間死鎖咐低、死循環(huán)、請(qǐng)求外部資源導(dǎo)致的長(zhǎng)時(shí)間等待等袜腥。線程出現(xiàn)停頓的時(shí)候通過(guò)jstack來(lái)查看各個(gè)線程的調(diào)用堆棧见擦,就可以知道沒(méi)有相應(yīng)的線程到底在后臺(tái)做什么事情,或者等待什么資源羹令。如果Java程序崩潰生成core文件鲤屡,jstack工具可以用來(lái)獲得core文件的java stack和natice stack的信息,從而可以輕松的知道java程序是如何崩潰和在程序何處發(fā)生問(wèn)題福侈,另外酒来,jstack工具還可以附屬到正在運(yùn)行的java程序中,看到當(dāng)時(shí)運(yùn)行的java程序的java stack和native stack的信息肪凛,如果現(xiàn)在運(yùn)行的java程序呈現(xiàn)hung的狀態(tài)堰汉,jstack是非常有用的。
在thread dump中显拜,要留意下面幾種狀態(tài)
死鎖衡奥,DeadLock(重點(diǎn)關(guān)注)
等待資源 Waiting on condition(重點(diǎn)關(guān)注)
等待獲取監(jiān)視器 Waiting on monitor entrty(重點(diǎn)關(guān)注)
阻塞 Blocked(重點(diǎn)關(guān)注)
執(zhí)行中 Runnable
暫停 Suspended
對(duì)象等待中 Object.wait()或TIMED_WAITING
停止 Parked
示例1
統(tǒng)計(jì)線程數(shù)
jstack -l pid |grep 'java.lang.Thread.State' | wc -l
1.7 jconsole
jconsole:Java Monitoring and Management Console,Java 5引入远荠,一個(gè)內(nèi)置Java性能分析器矮固,可以從命令行或者GUI Shell中運(yùn)行∑┐荆可以輕松地使用Jconsole來(lái)監(jiān)控Java應(yīng)用程序性能和跟蹤Java中的代碼
如何啟動(dòng)Jconsole
如果是命令行啟動(dòng)档址,使用JDK在PATH上,運(yùn)行jconsole即可
如果在GUI Shell啟動(dòng)邻梆,找到JDK安裝路徑守伸,打開(kāi)bin目錄,雙擊jconsole
當(dāng)分析工具彈出時(shí)(取決于正在運(yùn)行的java版本以及正在運(yùn)行的java程序數(shù)量)浦妄,可能會(huì)出現(xiàn)一個(gè)對(duì)話框尼摹,要求輸入一個(gè)進(jìn)程的URL來(lái)連接见芹,也可能累出許多不同的本地java進(jìn)程(有時(shí)包含jconsole進(jìn)程本身)來(lái)連接。如下圖所示:想分析哪個(gè)進(jìn)程就雙擊哪個(gè)進(jìn)程
1.8 hprof
hprof:Heap/CPU profiling Tool 能夠展現(xiàn)CPU使用率蠢涝,統(tǒng)計(jì)堆內(nèi)存使用情況
JVM調(diào)優(yōu)工具-Linux工具
2.1 top
Linux中的top命令顯示系統(tǒng)上正在運(yùn)行的進(jìn)程玄呛,他是系統(tǒng)管理員最重要的工具之一,被廣泛用于監(jiān)視服務(wù)器的負(fù)載和二。top命令是一個(gè)交互命令徘铝,在運(yùn)行top的時(shí)候還可以運(yùn)行很多命令
top的使用方式 top [-d number] | top [-bnp]
top:顯示進(jìn)程信息
top -c : 顯示完整命令
top -b :以批處理模式顯示程序信息
: 以累計(jì)模式顯示程序信息
2.2 vmstat
Virtual Meomory Statisctics (虛擬內(nèi)存統(tǒng)計(jì)),可對(duì)炒作系統(tǒng)的虛擬內(nèi)存惯吕、進(jìn)程惕它、CPU活動(dòng)進(jìn)行監(jiān)控
vmstat 3 每三秒監(jiān)控一次
2.3 iostat
需要安裝
2.4 pidstat
需要安裝
JVM調(diào)優(yōu)工具-第三方工具
3.1 VisualVM
需要手動(dòng)安裝對(duì)應(yīng)插件
3.2 MAT
Memory Analyzer Tool
eclipse或idea上可以下載插件。有時(shí)候dump文件太大的話废登,可以下載LInux的MAT淹魄。
3.3 GCWviewer
3.4 Arthas
alibaba開(kāi)源的java診斷工具,下載jar包钳宪,然后運(yùn)行揭北。