jmap histo /pid > ./log.txt :查看某一程序實例個數,佔用記憶體的位元組數,以及所屬的類別
#jmap -heap /pid :查看堆資訊
#jmap ‐dump:format=b, file=app.hprof /pid
透過jvisualvm指令啟動jvm視覺化管理介面可匯入dump檔案進行分析:檢視類別的實例
分析死鎖:寫一段死鎖程式碼
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 優先權=5; tid=0x0000000019aa9000 執行緒id; nid=0x6c4執行緒對應的本機執行緒識別nid;java.lang.Thread.State: BLOCKED 執行緒狀態
## 啟動jvisual指令選擇對應的程序即可查看到死鎖的執行緒 Jstack分析CPU使用率高的執行緒堆疊資訊啟動一個while循環,使CPU一直工作1、top -p /pid:查看進程佔用資源狀況 顯而易見該進程導致CPU使用率幾乎100%。 2、按H查看進程內每個執行緒佔用資源的狀況 #3、找到CPU使用近100%的PID這列,表示執行緒tid為5027,透過轉換器轉為16進位為13a3,4、透過jstack指令執行jstack 5026|grep -A 10 13a3,即可得到執行緒tid為13a3的堆疊訊息,進而找到導致CPU佔用100%的執行行號 jinfo查看jvm系統參數jinfo -flags /pid :查看jvm參數 #jinfo -sysprops /pid:查看java的系統參數 Jstat查看堆記憶體使用和類別載入的數量資訊jstat -gc /pid: 垃圾回收統計 S0C:第一個倖存區的大小,單位KB;S1C:第二個倖存區的大小;S0U:第一個倖存區的使用大小;S1U:第二個倖存區的使用大小; EC:伊甸園園區的大小; EU:伊甸園園區的使用大小; OC:老年代大小; OU:老年代使用大小; MC:方法區大小(元空間) ;MU:方法區使用大小; CCSC:壓縮類別空間大小; CCSU:壓縮類別空間使用大小; YGC:年輕代垃圾回收次數; YGCT:年輕代垃圾回收消耗時間,單位s; FGC:老年代垃圾回收次數; FGCT:老年代垃圾回收消耗時間,單位s; GCT:垃圾回收消耗總時間,單位sjstat -gccapacity/pid: 堆內存統計 #NGCMN:新生代最小容量;NGCMX:新生代最大容量;NGC:目前新生代容量;S0C:第一個倖存區大小;S1C:第二個倖存區的大小; EC:伊甸園園區的大小;OGCMN:老年代最小容量;OGCMX:老年代最大容量;OGC:目前老年代大小;OC:目前老年代大小;MCMN:最小元資料容量;MCMX:最大元資料容量;MC :目前元資料空間大小;CCSMN:最小壓縮類別空間大小;CCSMX:最大壓縮類別空間大小;CCSC:目前壓縮類別空間大小;YGC:年輕代gc次數;FGC:老年代GC次數# jstat -gcnew /pid: 查看新生代垃圾回收統計 #TT:物件在新生代存活的次數; MTT:物件在新生代存活的最大次數; DSS:期望的倖存區大小jstat -gcnewcapacity/pid:查看新生代記憶體容量##S0CMX:最大存活1區大小;S1CMX:最大存活2區大小;ECMX:最大伊甸園園區大小
jstat -gcold /pid:查看舊年代垃圾回收統計
##jstat -gcoldcapacity/pid:看老年代記憶體容量
jstat -gcmetacapacity/pid:查看元資料空間統計
透過jstat gc -pid指令可以最佳化java應用的啟動參數,jstat -gc pid 1000 10 (每隔1秒執行1次指令,共執行10次)預估每秒Eden區會新增多少對象,可依具體結果調整時間。優化想法其實簡單來說就是盡量讓每次Young GC後的存活對像小於Survivor區域的50%,都留存在年輕代裡。盡量別讓對象進入老年代。盡量減少Full GC的頻率,避免頻繁Full GC對JVM性能的影響。
對於一些老舊的數據,例如jvm級別的內存沒有及時清理,導致數據越堆越多,時間長了就會頻繁導致full gc,從而導致內存洩漏。可以使用成熟快取架構ehcache,他們有實現LRU資料淘汰策略。
以上是Java JVM虛擬機調優的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!