您好,登錄后才能下訂單哦!
今天小編給大家分享一下Java JVM虛擬機(jī)調(diào)優(yōu)的方法的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來(lái)了解一下吧。
jmap histo /pid > ./log.txt :查看某一進(jìn)程實(shí)例個(gè)數(shù),占用內(nèi)存的字節(jié)數(shù),以及所屬的類(lèi)
jmap -heap /pid :查看堆信息
jmap ‐dump:format=b,file=app.hprof /pid
通過(guò)jvisualvm命令啟動(dòng)jvm可視化管理界面可導(dǎo)入dump文件進(jìn)行分析:查看類(lèi)的實(shí)例
分析死鎖:寫(xiě)一段死鎖代碼
public class DeadLockTest { private final static Object lock1 = new Object(); private final static Object lock2 = new Object(); public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { synchronized (lock1) { try { System.out.println(Thread.currentThread().getName() + ": get the lock1"); Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (lock2) { System.out.println(Thread.currentThread().getName() + ": get the lock2"); } } } }).start(); new Thread(new Runnable() { @Override public void run() { synchronized (lock2) { try { System.out.println(Thread.currentThread().getName() + ": get the lock2"); Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (lock1) { System.out.println(Thread.currentThread().getName() + ": get the lock1"); } } } }).start(); } }
"Thread-1" 線(xiàn)程名;prio=5 優(yōu)先級(jí)=5; tid=0x0000000019aa9000線(xiàn)程id; nid=0x6c4線(xiàn)程對(duì)應(yīng)的本地線(xiàn)程標(biāo)識(shí)nid; java.lang.Thread.State: BLOCKED 線(xiàn)程狀態(tài)
啟動(dòng) jvisualvm命令選擇對(duì)應(yīng)的進(jìn)程即可查看到死鎖的線(xiàn)程
Jstack分析CPU使用率高的線(xiàn)程堆棧信息
啟動(dòng)一個(gè)while循環(huán),使CPU一直工作
1、top -p /pid:查看進(jìn)程占用資源情況
顯而易見(jiàn)該進(jìn)程導(dǎo)致CPU使用率幾乎100%。
2、按H查看進(jìn)程內(nèi)每個(gè)線(xiàn)程占用資源的情況
3、找到CPU使用近100%的PID這列,表示線(xiàn)程tid為5027,通過(guò)轉(zhuǎn)換器轉(zhuǎn)為16進(jìn)制為13a3,
4、通過(guò)jstack命令執(zhí)行jstack 5026|grep -A 10 13a3,即可得到線(xiàn)程tid為13a3的堆棧信息,進(jìn)而找到導(dǎo)致CPU占用100%的執(zhí)行行號(hào)
jinfo -flags /pid :查看jvm參數(shù)
jinfo -sysprops /pid:查看java的系統(tǒng)參數(shù)
jstat -gc /pid:垃圾回收統(tǒng)計(jì)
S0C:第一個(gè)幸存區(qū)的大小,單位KB; S1C:第二個(gè)幸存區(qū)的大??; S0U:第一個(gè)幸存區(qū)的使用大小;S1U:第二個(gè)幸存區(qū)的使用大?。?EC:伊甸園區(qū)的大??; EU:伊甸園區(qū)的使用大小; OC:老年代大?。?OU:老年代使用大??; MC:方法區(qū)大小(元空間) ;MU:方法區(qū)使用大??; CCSC:壓縮類(lèi)空間大??; CCSU:壓縮類(lèi)空間使用大小; YGC:年輕代垃圾回收次數(shù); YGCT:年輕代垃圾回收消耗時(shí)間,單位s; FGC:老年代垃圾回收次數(shù); FGCT:老年代垃圾回收消耗時(shí)間,單位s; GCT:垃圾回收消耗總時(shí)間,單位s
jstat -gccapacity/pid: 堆內(nèi)存統(tǒng)計(jì)
NGCMN:新生代最小容量;NGCMX:新生代最大容量;NGC:當(dāng)前新生代容量;S0C:第一個(gè)幸存區(qū)大?。籗1C:第二個(gè)幸存區(qū)的大??;EC:伊甸園區(qū)的大?。籓GCMN:老年代最小容量;OGCMX:老年代最大容量;OGC:當(dāng)前老年代大??;OC:當(dāng)前老年代大小;MCMN:最小元數(shù)據(jù)容量;MCMX:最大元數(shù)據(jù)容量;MC:當(dāng)前元數(shù)據(jù)空間大??;CCSMN:最小壓縮類(lèi)空間大?。籆CSMX:最大壓縮類(lèi)空間大??;CCSC:當(dāng)前壓縮類(lèi)空間大小;YGC:年輕代gc次數(shù);FGC:老年代GC次數(shù)
jstat -gcnew /pid:查看新生代垃圾回收統(tǒng)計(jì)
TT:對(duì)象在新生代存活的次數(shù); MTT:對(duì)象在新生代存活的最大次數(shù); DSS:期望的幸存區(qū)大小
jstat -gcnewcapacity/pid:查看新生代內(nèi)存容量
S0CMX:最大幸存1區(qū)大小;S1CMX:最大幸存2區(qū)大?。籈CMX:最大伊甸園區(qū)大小
jstat -gcold /pid:查看老年代垃圾回收統(tǒng)計(jì)
jstat -gcoldcapacity/pid:查看老年代內(nèi)存容量
jstat -gcmetacapacity/pid:查看元數(shù)據(jù)空間統(tǒng)計(jì)
通過(guò)jstat gc -pid命令可以?xún)?yōu)化java應(yīng)用的啟動(dòng)參數(shù),jstat -gc pid 1000 10 (每隔1秒執(zhí)行1次命令,共執(zhí)行10次)預(yù)估每秒Eden區(qū)會(huì)新增多少對(duì)象,可根據(jù)具體結(jié)果調(diào)整時(shí)間。優(yōu)化思路其實(shí)簡(jiǎn)單來(lái)說(shuō)就是盡量讓每次Young GC后的存活對(duì)象小于Survivor區(qū)域的50%,都留存在年輕代里。盡量別讓對(duì)象進(jìn)入老年代。盡量減少Full GC的頻率,避免頻繁Full GC對(duì)JVM性能的影響。
對(duì)于一些老舊的數(shù)據(jù),比如jvm級(jí)別的內(nèi)存沒(méi)有及時(shí)清理,導(dǎo)致數(shù)據(jù)越堆越多,時(shí)間長(zhǎng)了就會(huì)頻繁導(dǎo)致full gc,從而導(dǎo)致內(nèi)存泄漏。可以使用成熟緩存架構(gòu)ehcache,他們有實(shí)現(xiàn)LRU數(shù)據(jù)淘汰策略。
以上就是“Java JVM虛擬機(jī)調(diào)優(yōu)的方法”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。