Java?JVM虛擬機調(diào)優(yōu)詳解
jmap查看內(nèi)存信息
jmap histo /pid > ./log.txt :查看某一進程實例個數(shù),占用內(nèi)存的字節(jié)數(shù),以及所屬的類
jmap -heap /pid :查看堆信息
jmap ‐dump:format=b,file=app.hprof /pid
通過jvisualvm命令啟動jvm可視化管理界面可導(dǎo)入dump文件進行分析:查看類的實例
jstack
分析死鎖:寫一段死鎖代碼
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" 線程名;prio=5 優(yōu)先級=5; tid=0x0000000019aa9000線程id; nid=0x6c4線程對應(yīng)的本地線程標識nid; java.lang.Thread.State: BLOCKED 線程狀態(tài)
啟動 jvisualvm命令選擇對應(yīng)的進程即可查看到死鎖的線程
Jstack分析CPU使用率高的線程堆棧信息
啟動一個while循環(huán),使CPU一直工作
1、top -p /pid:查看進程占用資源情況
顯而易見該進程導(dǎo)致CPU使用率幾乎100%。
2、按H查看進程內(nèi)每個線程占用資源的情況
3、找到CPU使用近100%的PID這列,表示線程tid為5027,通過轉(zhuǎn)換器轉(zhuǎn)為16進制為13a3,
4、通過jstack命令執(zhí)行jstack 5026|grep -A 10 13a3,即可得到線程tid為13a3的堆棧信息,進而找到導(dǎo)致CPU占用100%的執(zhí)行行號
jinfo查看jvm系統(tǒng)參數(shù)
jinfo -flags /pid :查看jvm參數(shù)
jinfo -sysprops /pid:查看java的系統(tǒng)參數(shù)
Jstat查看堆內(nèi)存使用和類加載的數(shù)量信息
jstat -gc /pid:垃圾回收統(tǒng)計
S0C:第一個幸存區(qū)的大小,單位KB; S1C:第二個幸存區(qū)的大?。?S0U:第一個幸存區(qū)的使用大??;S1U:第二個幸存區(qū)的使用大??; EC:伊甸園區(qū)的大小; EU:伊甸園區(qū)的使用大小; OC:老年代大小; OU:老年代使用大小; MC:方法區(qū)大小(元空間) ;MU:方法區(qū)使用大??; CCSC:壓縮類空間大??; CCSU:壓縮類空間使用大小; YGC:年輕代垃圾回收次數(shù); YGCT:年輕代垃圾回收消耗時間,單位s; FGC:老年代垃圾回收次數(shù); FGCT:老年代垃圾回收消耗時間,單位s; GCT:垃圾回收消耗總時間,單位s
jstat -gccapacity/pid: 堆內(nèi)存統(tǒng)計
NGCMN:新生代最小容量;NGCMX:新生代最大容量;NGC:當前新生代容量;S0C:第一個幸存區(qū)大??;S1C:第二個幸存區(qū)的大??;EC:伊甸園區(qū)的大??;OGCMN:老年代最小容量;OGCMX:老年代最大容量;OGC:當前老年代大?。籓C:當前老年代大?。籑CMN:最小元數(shù)據(jù)容量;MCMX:最大元數(shù)據(jù)容量;MC:當前元數(shù)據(jù)空間大?。籆CSMN:最小壓縮類空間大?。籆CSMX:最大壓縮類空間大?。籆CSC:當前壓縮類空間大??;YGC:年輕代gc次數(shù);FGC:老年代GC次數(shù)
jstat -gcnew /pid:查看新生代垃圾回收統(tǒng)計
TT:對象在新生代存活的次數(shù); MTT:對象在新生代存活的最大次數(shù); DSS:期望的幸存區(qū)大小
jstat -gcnewcapacity/pid:查看新生代內(nèi)存容量
S0CMX:最大幸存1區(qū)大小;S1CMX:最大幸存2區(qū)大?。籈CMX:最大伊甸園區(qū)大小
jstat -gcold /pid:查看老年代垃圾回收統(tǒng)計
jstat -gcoldcapacity/pid:查看老年代內(nèi)存容量
jstat -gcmetacapacity/pid:查看元數(shù)據(jù)空間統(tǒng)計
通過jstat gc -pid命令可以優(yōu)化java應(yīng)用的啟動參數(shù),jstat -gc pid 1000 10 (每隔1秒執(zhí)行1次命令,共執(zhí)行10次)預(yù)估每秒Eden區(qū)會新增多少對象,可根據(jù)具體結(jié)果調(diào)整時間。優(yōu)化思路其實簡單來說就是盡量讓每次Young GC后的存活對象小于Survivor區(qū)域的50%,都留存在年輕代里。盡量別讓對象進入老年代。盡量減少Full GC的頻率,避免頻繁Full GC對JVM性能的影響。
內(nèi)存泄漏
對于一些老舊的數(shù)據(jù),比如jvm級別的內(nèi)存沒有及時清理,導(dǎo)致數(shù)據(jù)越堆越多,時間長了就會頻繁導(dǎo)致full gc,從而導(dǎo)致內(nèi)存泄漏??梢允褂贸墒炀彺婕軜?gòu)ehcache,他們有實現(xiàn)LRU數(shù)據(jù)淘汰策略。
到此這篇關(guān)于Java JVM虛擬機調(diào)優(yōu)詳解的文章就介紹到這了,更多相關(guān)Java JVM調(diào)優(yōu)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決IntelliJ IDEA 控制臺輸出中文亂碼問題(史上最簡單)
這篇文章主要介紹了史上最簡單的IntelliJ IDEA 控制臺輸出中文亂碼問題的解決方法,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧2018-05-05springboot?實現(xiàn)不同context-path下的會話共享
這篇文章主要介紹了springboot?實現(xiàn)不同context-path下的會話共享,基于很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01詳談java中int和Integer的區(qū)別及自動裝箱和自動拆箱
這篇文章主要介紹了詳談java中int和Integer的區(qū)別及自動裝箱和自動拆箱,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08Spring Boot 的創(chuàng)建和運行示例代碼詳解
Spring Boot 的誕生是為了簡化Spring程序的開發(fā),今天給大家介紹下Spring Boot 的創(chuàng)建和運行,主要包括Spring Boot基本概念和springboot優(yōu)點,本文通過實例代碼給大家介紹的非常詳細,需要的朋友參考下吧2022-07-07使用JavaConfig代替xml實現(xiàn)Spring配置操作
這篇文章主要介紹了使用JavaConfig代替xml實現(xiàn)Spring配置操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09

javaweb頁面附件、圖片下載及打開(實現(xiàn)方法)