## 常見jvm分析工具主要是為了查錯(cuò)和進(jìn)行調(diào)優(yōu)
## 一、CLI
1、jps(java process status)
? jsp:
? ? -p 只顯示pid 不顯示class 名稱奔害,jar文件名和傳遞給main方法的參數(shù)
? ? -m 只顯示輸出main方法的參數(shù) 在嵌入式j(luò)vm上可能是null
? ? -l 輸出應(yīng)用程序main class的完整package名或者應(yīng)用程序的jar文件完整路徑名
? ? -v 輸出傳遞給jvm的參數(shù)
? ? jps host 查看host的jps的情況 前提host提供jstatd服務(wù)
2、jstatd(了解·)
啟動jvm監(jiān)控服務(wù)他是一個(gè)基于rmi(遠(yuǎn)程接口調(diào)用)的應(yīng)用凳怨,向遠(yuǎn)程機(jī)器提供本機(jī)jvm應(yīng)用程序的信息,默認(rèn)端口1099 -p指定端口
實(shí)例:jstatd -J-Djava.security.policy=my.policy &
my.policy文件需要自己建立是鬼,內(nèi)如如下:
grant codebase "file:${java.home}/../lib/tools.jar" { permission java.security.AllPermission; };
這是安全策略文件肤舞,因?yàn)閖dk對jvm做了jaas(Java驗(yàn)證和授權(quán)API)的安全檢測,所以我們必須設(shè)置一些策略均蜜,使得jstatd被允許作網(wǎng)絡(luò)操作;
3.jmap
觀察運(yùn)行中的jvm物理內(nèi)存的占用情況
jmap:
pid 進(jìn)程號
常用參數(shù)
-heap:打印jvm heap(堆)的情況(垃圾收集器類型)
-histo:打印jvm heap的直方圖 其輸出信息包括類名李剖,對象數(shù)量,對象占用大小
histo:live 同上但是只打印存活對象的情況
-permstat:打印permanent generation heap(方法區(qū))情況(在jdk1.8之后不存在方法區(qū))
-finalizerinfo:打印正等候回收的對象信息
```
[bigdata@bigdata01 jvm]$ jmap -heap 8580
Attaching to process ID 8580, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.112-b15
using thread-local object allocation.
Parallel GC with 4 thread(s)
-Xms:500m -Xmx:1000m? ? 500M <= 堆空間 <= 1000m
Heap Configuration:
? MinHeapFreeRatio? ? ? ? = 0 ---->堆最小的空閑比例囤耳,此時(shí)堆的空間大小是多少:也就是說堆空間被占滿杖爽,顯然就是1000m
? MaxHeapFreeRatio? ? ? ? = 100 ---->堆最大的空閑比例,此時(shí)堆的空間大小是多少? 也就是說堆空間使用最小內(nèi)存紫皇,顯然就是500m
? MaxHeapSize? ? ? ? ? ? ? = 1048576000 (1000.0MB) 堆的最大空間大小
? NewSize? ? ? ? ? ? ? ? ? = 21495808 (20.5MB) 新生代初始化空間大小
? MaxNewSize? ? ? ? ? ? ? = 349175808 (333.0MB) 新生代最大空間大小
? OldSize? ? ? ? ? ? ? ? ? = 43515904 (41.5MB) 老年代的初始化空間大小
? NewRatio? ? ? ? ? ? ? ? = 2 老年代和新生代的內(nèi)存空間比例=2:1,加入調(diào)整為3-->-XX:NewRatio=3
? SurvivorRatio? ? ? ? ? ? = 8 Eden區(qū)和survivor空間比例:8:1:1
? MetaspaceSize? ? ? ? ? ? = 21807104 (20.796875MB) jdk1.8之后叫做元數(shù)據(jù)區(qū)腋寨,就是jdk1.8以前的PermSize聪铺, 初始化空間大小
? CompressedClassSpaceSize = 1073741824 (1024.0MB) 壓縮的類的空間大小
? MaxMetaspaceSize? ? ? ? = 17592186044415 MB 對應(yīng)的最大空間大小
? G1HeapRegionSize? ? ? ? = 0 (0.0MB)
Heap Usage:
PS Young Generation 新生代
Eden Space:
? capacity = 73400320 (70.0MB) 容量
? used? ? = 11939112 (11.386024475097656MB) 已用大小
? free? ? = 61461208 (58.613975524902344MB) 空閑大小
? 16.26574925013951% used
From Space:
? capacity = 4194304 (4.0MB)
? used? ? = 131072 (0.125MB)
? free? ? = 4063232 (3.875MB)
? 3.125% used
To Space:
? capacity = 6815744 (6.5MB)
? used? ? = 0 (0.0MB)
? free? ? = 6815744 (6.5MB)
? 0.0% used
PS Old Generation 老年代
? capacity = 76546048 (73.0MB)
? used? ? = 51528752 (49.14164733886719MB)
? free? ? = 25017296 (23.858352661132812MB)
? 67.31732512173588% used
16790 interned Strings occupying 1695440 bytes.
```
用jmap 把進(jìn)程內(nèi)存使用情況dump(相當(dāng)于導(dǎo)入)到文件中,在用jhat分析查看萄窜,jmap進(jìn)行dump命令格式如下
jmap -dump:fromat=b,file=dempFileNmae pid
jmap -dump:fromat=b,file=4574.heap20151215 4574
Dumping heap to 4574.heap20151215 4574
Heap dump file created
dump出來的文件可以用MAT铃剔、VisualVM等工具查看撒桨,這里用jhat查看:
jhat -port 9998 /tmp/dump.dat
注意如果Dump文件太大,可能需要加上-J-Xmx512m這種參數(shù)指定最大堆內(nèi)存键兜,即jhat -J-Xmx512m -port 9998 /tmp/dump.dat凤类。然后就可以在瀏覽器中輸入主機(jī)地址:9998查看了。
注意:-J-Xmx512m中間沒有空格普气。
4谜疤、jinfo(了解)
Configuration info
官方地址http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jinfo.html
jinfo [option] pid
pid 進(jìn)程號
參數(shù)如下:
no option:打印命令行參數(shù)和系統(tǒng)屬性
-flags 打印命令行參數(shù)
-sysprops 打印系統(tǒng)屬性
- h 幫助
-我們經(jīng)常通過-D來給jvm傳遞自定義的系統(tǒng)參數(shù)
后臺通過System.properties來獲取這個(gè)參數(shù),進(jìn)而進(jìn)行下一步的操作:
5现诀、jstack
jstack :stack trace
http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstack.html
jstack 能得到運(yùn)行java程序的java stack(java堆棧)和native stack(本地堆棧)的信息夷磕,可以輕松得知當(dāng)前線程的運(yùn)行情況
jstack[option] pid
參數(shù)如下
-l 長列表,打印關(guān)于鎖的附加信息仔沿,例如屬于java.util.concurrent的ownable synchronizers列表
-m 打印java和native c/c++框架的所有信息
tid指java Thread id坐桩。nid指native線程的id。prio是線程的優(yōu)先級[0x00007fd4f8684000]是線程棧起始地址
dump 文件里 值得關(guān)注線程有:
死鎖封锉,Deadlock(重點(diǎn)關(guān)注)
等待資源绵跷,Waiting on condition(重點(diǎn)關(guān)注)
等待獲取監(jiān)視器,Waiting on monitor entry(重點(diǎn)關(guān)注)
阻塞成福,Blocked(重點(diǎn)關(guān)注)
執(zhí)行中碾局,Runnable?
暫停,Suspended
對象等待中闷叉,Object.wait() 或 TIMED_WAITING
停止擦俐,Parked
6、jstat
jstatd:java virtual Machine statistics Monitoring Tool
http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstat.html
Usage:jstat -help|-options
jstat -<option> [-t] [-h<lines>] <pid> [<interva[s|ms]> [<count>]]
參數(shù)解釋:
Options -選項(xiàng)握侧,我們一般使用-gcutil? /-gc查看gc情況
pid -VM的進(jìn)程號蚯瞧,即當(dāng)前運(yùn)行的java進(jìn)程號
interval[s|ms] --間隔時(shí)間,單位為秒或者毫秒品擎,默認(rèn)為ms埋合。必須為正整型
count - 打印次數(shù) 如果缺省打印無數(shù)次
例如例如:jstat -gc 4645 500 10? 表示查看進(jìn)程號為4645的gc 每500ms打印一次? 共打印10次
jstat -gc 8580 100ms 10
參數(shù)說明
S0C --->survivor-0 capacity
S1C --->survivor-1 capacity
S0U --->survivor-0 used
S1U --->survivor-1 used
EC --->eden capacity
EU --->eden used
OC --->old generation capacity
OU --->old generation used
MC --->metaspace capacity/jdk1.8以前叫PC
MU --->metaspace used/jdk1.8以前叫PU
CCSC --->compressed class space capacity
CCSU --->compressed class space used
YGC --->截止到目前為止總共執(zhí)行了多少次ygc(minor gc)
YGCT --->截止到目前為止總共執(zhí)行ygc消耗的時(shí)間(單位秒)
FGC --->截止到目前為止總共執(zhí)行了多少次fullgc(minor gc)
FGCT --->截止到目前為止總共執(zhí)行fullgc消耗的時(shí)間(單位秒)
GCT? --->截止到目前為止所有g(shù)c消耗的時(shí)間(單位秒)
## 二、GUI
1萄传、jconsole 可視化的jvm監(jiān)控軟件
可以監(jiān)控本地或者遠(yuǎn)程進(jìn)程
主要包括:概括甚颂、內(nèi)存、線程秀菱、類振诬、Vm概要、Mbean選項(xiàng)卡
概括選項(xiàng)卡:呈現(xiàn)四副圖表:主要包括堆內(nèi)存使用量衍菱、類赶么、線程、cpu占有率
內(nèi)存選項(xiàng)卡:包括堆內(nèi)存脊串、非堆內(nèi)存辫呻、內(nèi)存池的使用量圖表和詳細(xì)信息清钥。、相當(dāng)于jstat命令
線程選項(xiàng)卡:顯示所有的線程的信息圖表放闺、相當(dāng)于jstack命令
類選項(xiàng)卡:加載類的信息
Vm概要:Vm的概要信息包括堆大小祟昭、垃圾收集信息、Vm參數(shù)等
Mbean選項(xiàng):managed beans 被管理的beans
2怖侦、jvisualvm篡悟,
多合一的故障處理工具
visual vm是迄今為止,jdk發(fā)布的功能最強(qiáng)大的運(yùn)行監(jiān)視和故障處理程序础钠∏×Γ可以查看本都和遠(yuǎn)程的狀態(tài)
優(yōu)點(diǎn):不需要被監(jiān)控的程序基于特殊的Agent運(yùn)型,因此他對應(yīng)用程序的實(shí)際影響很小旗吁,這樣他可以直接運(yùn)行在生產(chǎn)環(huán)境中踩萎,這是其他監(jiān)視工具比如:jprofile、yourkit無法與之相比的
visualvm.exe
主要特點(diǎn):
1很钓、插件安裝香府。
2、生成码倦、瀏覽堆轉(zhuǎn)儲快照和線程快照企孩。
3、抽樣器和profiler中分析程序性能袁稽。
4勿璃、BTrace插件動態(tài)日志跟蹤。
# 三推汽、 常見jvm調(diào)優(yōu)參數(shù)總結(jié)
Java1.7的jvm參數(shù)查看一下官方網(wǎng)站补疑。
http://docs.oracle.com/javase/7/docs/technotes/tools/windows/java.html
Java1.8
http://docs.oracle.com/javase/8/docs/technotes/tools/windows/java.html
Hotspotvm知識查看一下官方網(wǎng)站。
http://www.oracle.com/technetwork/java/javase/tech/index-jsp-136373.html
主要的參數(shù)是:堆的大小歹撒、棧的大小莲组、新生代和老年代的比值、新生代中eden和s0暖夭、s1的比值锹杈。
**-Xms:初始堆大小**,默認(rèn)是物理內(nèi)存的1/64迈着。默認(rèn)(MinHeapFreeRatio參數(shù)可以調(diào)整)空余堆內(nèi)存小于40%時(shí)竭望,JVM就會增大堆直到--Xmx的最大限制。例如:-Xms 20m裕菠。
**-Xmx:最大堆大小**咬清。默認(rèn)是物理內(nèi)存的1/4? 默認(rèn)(MaxHeapFreeRatio參數(shù)可以調(diào)整)空余堆內(nèi)存大于70%時(shí),JVM會減少堆直到 -Xms的最小限制。
-**XX:NewSize=n**:設(shè)置年輕代大蟹阏瘛(初始值)。
**-XX:MaxNewSize**:設(shè)置年輕代最大值萤彩。
**-XX:NewRatio=n:**設(shè)置年輕代和年老代的比值粪滤。
**-XX:SurvivorRatio=n**:年輕代中Eden區(qū)與兩個(gè)Survivor區(qū)的比值。
**-XX:PermSize**(1.8之后改為MetaspaceSize)? 設(shè)置持久代(perm gen)初始值雀扶,默認(rèn)是物理內(nèi)存的1/64杖小。
**-XX:MaxPermSize=n**:(1.8之后改為MaxMetaspaceSize)設(shè)置最大持久代大小。
**-Xss**:每個(gè)線程的堆棧大小愚墓。
面試的時(shí)候如何闡述jvm予权,gc
運(yùn)行時(shí)區(qū)域--->gc(堆)--->不被引用的對象(引用?)--->判斷對象是否被引用--->可達(dá)性分析(兩次標(biāo)記)---->gc使用方式(gc的算法)--->minor gc 或者major gc浪册。
常見的優(yōu)化參數(shù):
? -Xms
? -Xmx
? -XX:NewSize...
垃圾收集器
? CMS扫腺、Serial、ParNew
常見的分析工具
? jsp
? jmap
? jstack
? jconsole