java -XX:+PrintFlagsInitial :查看所有JVM參數(shù)啟動(dòng)的初始值
java -XX:+PrintFlagsFinal :查看所有JVM參數(shù)的最終值
java -參數(shù)名稱:+PrintCommandLineFlags :查看那些已經(jīng)被用戶或者JVM設(shè)置過的詳細(xì)的XX參數(shù)的名稱和值
jps:java process Status?
1)jps:查看當(dāng)前運(yùn)行中java的線程
2)jps -q :僅顯示進(jìn)程ID
3)jps -l :輸出進(jìn)程ID和程序的全類名,如果是jar包輸出jar完整路徑
4)jps -m:輸出進(jìn)程啟動(dòng)時(shí)傳遞給main()的參數(shù)
5)jps -v:列出進(jìn)程啟動(dòng)時(shí)的JVM參數(shù)吕晌,比如 -Xms20m
如果某java進(jìn)程關(guān)閉了默認(rèn)開啟的UsePerfData參數(shù)(-XX:-UsePerfData)番官,那jps將無法知道該進(jìn)程
jstat:JVM Statistics Monitoring Tool?
查看JVM統(tǒng)計(jì)信息,類裝載、內(nèi)存虹菲、垃圾收集憋肖、JIT編譯等運(yùn)行數(shù)據(jù)。
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
interval?單位是毫秒胰苏,每過多久打印一次
count?打印多少次硕蛹,默認(rèn)一個(gè)參數(shù)是interval
-t?程序從開始執(zhí)行到現(xiàn)在過了多少時(shí)間 ms
-h?每個(gè)多少多少條打印一次表頭
-class舉例:jstat -class -t -h3 13152 1000 10
其中h3中的3代表每隔3個(gè)分隔一次,13152代表類的進(jìn)程id,1000代表每隔1000毫秒打印一次法焰,10代表一共打印10次秧荆,如下所示:其中Timestamp代表程序至今的運(yùn)行時(shí)間,單位為秒埃仪;Loaded代表加載的類的數(shù)目乙濒;Bytes代表加載的類的總字節(jié)數(shù);Unloaded代表卸載的類的數(shù)目卵蛉;Bytes代表卸載的類的總字節(jié)數(shù)颁股;Time代表類裝載所消耗的時(shí)間;
<option>
常用的option
1)-gc :查看jvm在GC時(shí)的信息傻丝,顯示指定線程的內(nèi)存使用情況
S0C代表幸存者0區(qū)的總?cè)萘扛视校琒1C代表幸存者1區(qū)的總?cè)萘浚琒0U代表幸存者0區(qū)使用的容量葡缰,S1U代表幸存者1區(qū)使用的容量亏掀,EC代表伊甸園區(qū)的總?cè)萘浚珽U代表伊甸園區(qū)使用的總?cè)萘糠菏停琌C代表老年代的總?cè)萘炕系琌U代表老年代已經(jīng)使用的容量
MC代表方法區(qū)的總?cè)萘浚琈U代表方法區(qū)的總?cè)萘啃舶模珻CSC代表壓縮類的總?cè)萘扛没ィ珻CSU代表壓縮類使用的容量
YGC代表年輕代垃圾回收的次數(shù),YGCT年輕代進(jìn)行垃圾回收需要的時(shí)間韭畸,F(xiàn)GC代表代表Full GC的次數(shù)宇智,F(xiàn)GCT代表Full GC的時(shí)間,GCT代表從應(yīng)用程序啟動(dòng)到采樣時(shí)gc的總時(shí)間
常用的使用方式
1. 計(jì)算垃圾回收占運(yùn)行時(shí)間的比例
我們執(zhí)行jstat -gc -t 13152 1000 10胰丁,這代表1秒打印出1行随橘,一共10行,-t代表打印出Timestamp總運(yùn)行時(shí)間
通過Timestamp得到程序運(yùn)行時(shí)間差锦庸,通過GCT得到垃圾回收時(shí)間差机蔗,單位都是秒,相除即為GC時(shí)間占運(yùn)行時(shí)間的比例甘萧。如果高于20%說明堆壓力較大萝嘁,超過90%說明當(dāng)前堆隨時(shí)有可能溢出報(bào)OOM。在項(xiàng)目部署之后就需要使用命令行去看了扬卷,就沒有可視化界面了牙言,所以這種方式也要會(huì)。
2. 判斷有可能存在的內(nèi)存泄漏問題
通過在每一段固定的時(shí)間內(nèi)抽取最小值的OU(老年代使用的空間)怪得,如果這個(gè)值一直呈上升趨勢(shì)的話咱枉,意味著無法回收的對(duì)象在不斷增加卑硫,可能存在內(nèi)存泄漏。
jinfo:Configuration Info for Java
實(shí)時(shí)查看和修改JVM配置參數(shù)?:jinfo <option> <pid>
常用的option
1)jinfo -flag 屬性 進(jìn)程id:查看某個(gè)參數(shù)情況
jmap:JVM Memory Map
導(dǎo)出內(nèi)存映像dump文件 & 獲取內(nèi)存使用情況
jmap [option] <pid>
jmap [option] <executable <core>>
jmap [option] [server_id@]<remote server IP or hostname>
常用命令
1.??導(dǎo)出內(nèi)存映像文件
jmap -dump:live,format=b,file=usr/desktop/test.hprof 1130
1. 一般使用的是第二種方式蚕断,也就是生成堆中存活對(duì)象的快照欢伏,畢竟這種方式生成的dump文件更小,我們傳輸處理都更方便亿乳。
2. file=后面的是生成的dump文件地址颜懊,filename是文件路徑+文件名稱,后綴名必須是.hprof风皿。format=b表示生成的是標(biāo)準(zhǔn)的dump文件河爹,用來進(jìn)行格式限定。
3. 自動(dòng)方式在生成的dump文件之前通常會(huì)觸發(fā)一次Full GC桐款,所以里面都是Full GC后留下的對(duì)象信息咸这。如果希望在程序發(fā)生OOM退出系統(tǒng)的時(shí)候能自動(dòng)導(dǎo)出dump文件,那么就需要使用自動(dòng)方式魔眨。
2.??顯示堆內(nèi)存的相關(guān)信息
2.1)jmap -heap pid (jdk8之后失效)
jdk8之后使用:jhsdb jmap --heap --pid pid
導(dǎo)出這一刻堆空間的使用情況媳维,使用jstat和visualVM更好。
2.2)jmap -histo pid
查看這一時(shí)刻內(nèi)存對(duì)象實(shí)例數(shù)量遏暴,包括它所在的class name侄刽、所占容量、按照所占容量大小進(jìn)行排序朋凉。
注意
由于jmap將訪問堆中的所有對(duì)象州丹,為了保證在此過程中不被應(yīng)用線程干擾,jmap需要借助安全點(diǎn)機(jī)制杂彭,讓所有線程停留在不改變堆中數(shù)據(jù)的狀態(tài)墓毒,也就是說,由jmap導(dǎo)出的堆快照必定是安全點(diǎn)位置的亲怠,這可能導(dǎo)致基于該堆快照的分析結(jié)果存在偏差所计。也就是說,假設(shè)在編譯生成的機(jī)器碼中团秽,某些對(duì)象的生命周期在兩個(gè)安全點(diǎn)之間主胧,那么:live選項(xiàng)將無法探知到這些對(duì)象。另外习勤,如果某個(gè)線程長(zhǎng)時(shí)間無法跑到安全點(diǎn)踪栋,jmap將一直等下去,與前面講的jstat則不同姻报,垃圾回收器會(huì)主動(dòng)將jstat所需要的摘要數(shù)據(jù)保存至固定位置之中己英,而jstat只需直接讀取即可间螟。
jhat:JVM Heap Analysis Tool
JDK自帶堆分析工具吴旋,與jmap命令搭配使用损肛,用于分析jmap生成的heap dump文件,jhat內(nèi)置了一個(gè)微型的HTTP/HTML服務(wù)器(端口是7000)荣瑟,生成dump文件的分析結(jié)果后治拿,用戶可以在瀏覽器中查看分析結(jié)果(可以通過OQL語(yǔ)句進(jìn)行過濾查詢)。
jhat命令在jdk9及其之后就被移除了笆焰,官方建議使用jvisualvm代替jhat劫谅,所以該指令只需簡(jiǎn)單了解一下即可。
jhat [option] [dumpfile]嚷掠,其中dumpfile代表dump文件的地址以及名稱
jstak:JVM Stack Trace
打印JVM中線程快照(JVM內(nèi)指定進(jìn)程的每一條線程正在執(zhí)行的方法堆棧的集合)捏检。可用于定位線程出現(xiàn)長(zhǎng)時(shí)間停頓的原因不皆,如線程間的死鎖贯城、死循環(huán)、請(qǐng)求外部資源導(dǎo)致的長(zhǎng)時(shí)間等待等問題霹娄,這些都是導(dǎo)致線程長(zhǎng)時(shí)間停頓的常見原因能犯,當(dāng)線程出現(xiàn)長(zhǎng)時(shí)間停頓的時(shí)候,就可以使用jstack顯示各個(gè)線程調(diào)用的堆棧情況犬耻。也可以通過java層面:Thread.getAllStackTrances() 得到一個(gè)Map<Thread, StackTranceElement[] >來實(shí)現(xiàn)踩晶。
jstack [option] pid
在thread dump中,要留意下面幾種狀態(tài):
1)死鎖 Deadlock????
2)等待資源 Waiting on condition? ??
3)等待獲取監(jiān)視器 Waiting on monitor entry
4)阻塞 Blocked
5)執(zhí)行中 Runnable
6)暫停 Suspended
7)對(duì)象等待中枕磁,Object.wait() 或 TIMED_WAITING
8)停止 Parked
jcmd
jdk1.7后新增渡蜻,可以用來實(shí)現(xiàn)除了jstat之外所有命令。
首先通過 jcmd 進(jìn)程號(hào) help 得出命令列表:根據(jù)以下命令來替換之前的那些操作:
Thread.print 可以替換 jstack指令
GC.class_histogram 可以替換 jmap中的-histo操作
GC.heap_dump 可以替換 jmap中的-dump操作
GC.run 可以查看GC的執(zhí)行情況
VM.uptime 可以查看程序的總執(zhí)行時(shí)間计济,可以替換jstat指令中的-t操作
VM.system_properties 可以替換 jinfo -sysprops 進(jìn)程id
VM.flags 可以獲取JVM的配置參數(shù)信息?