1.先找進(jìn)程:
ps?-ef|grep?tomcat
root??????2303?????1?33?18:57?pts/2?
2.在找負(fù)載高的pid
top?-Hp?2303
(按CPU排序,找到對應(yīng)的PID即是CPU占用最多的線程诅妹,
在Java中可以使用jstack將該線程的堆棧打印出來罚勾,使用這個線程ID查找對應(yīng)的線程堆棧(要先將線程ID轉(zhuǎn)換成16進(jìn)制))
?PID?USER??????PR??NI??VIRT??RES??SHR?S?%CPU?%MEM????TIME+??COMMAND???????????????????????????????????????
?2474?root??????15???0?1134m?904m??18m?S??0.3?46.3???0:02.91?java??????????????????????????????????????????
?2303?root??????18???0?1134m?904m??18m?S??0.0?46.3???0:00.00?java??????????????????????????????????????????
?2304?root??????22???0?1134m?904m??18m?S??0.0?46.3???0:01.08?java??????????????????????????????????????????
?2306?root??????16???0?1134m?904m??18m?S??0.0?46.3???1:54.37?java???
3.
printf?"%x\n"??2474
得到2474的十六進(jìn)制值
4.查到代碼(jstack顯示虛擬機(jī)的線程快照)
jstack?2303?|?grep?9aa?-A?10?(-A顯示之后的10行)
5.使用jstat?-gcutil命令查看進(jìn)程的內(nèi)存情況(jstat?用于收集HotSpot虛擬機(jī)各方面的運(yùn)行數(shù)據(jù))
??jstat?-gcutil??2303?2000?10?
每個2s輸出一次,輸出10次??
各個字段的介紹:
S0吭狡、S1?代表兩個Survivor區(qū)尖殃;
E?代表?Eden?區(qū);
O(Old)代表老年代划煮;
P(Permanent)代表永久代送丰; --------->java 8 之前
M (Metadata) 代表元數(shù)據(jù)? ? ---------->java8 之后
YGC(Young?GC)代表Minor?GC;
YGCT代表Minor?GC耗時弛秋;
FGC(Full?GC)代表Full?GC耗時器躏;
GCT代表Minor?&?Full?GC共計耗時
具體描述
S0年輕代中第一個survivor(幸存區(qū))已使用的占當(dāng)前容量百分比
S1年輕代中第二個survivor(幸存區(qū))已使用的占當(dāng)前容量百分比
E年輕代中Eden(伊甸園)已使用的占當(dāng)前容量百分比
O????old代已使用的占當(dāng)前容量百分比
P????perm代已使用的占當(dāng)前容量百分比? ?---------->java 8 之前
M? ?metadata表示占用容器的百分比? ?----------->java8 之后
YGC從應(yīng)用程序啟動到采樣時年輕代中g(shù)c次數(shù)
YGCT從應(yīng)用程序啟動到采樣時年輕代中g(shù)c所用時間(s)
FGC從應(yīng)用程序啟動到采樣時old代(全gc)gc次數(shù)
FGCT從應(yīng)用程序啟動到采樣時old代(全gc)gc所用時間(s)
GCT從應(yīng)用程序啟動到采樣時gc用的總時間(s)
解釋java堆分:
Java?堆分為新生代和老年代,新生代一般劃分為三塊區(qū)域蟹略,Eden?+?From?Survivor?+?To?Survivor登失,Eden?和?Survivor?的內(nèi)存比為8:1,每次只使用一個Eden和一個?Survivor?區(qū)域挖炬,另一個Survivor?用于復(fù)制收集算法回收內(nèi)存揽浙。
對象一般盡量分配到新生代中,而對于大對象(長字符串和大數(shù)組)直接分配在老年代中意敛,同時“年齡”長的的對象會從新生代自動晉升到老年代中馅巷。
Java?方法區(qū)稱為永久代,只有?HotSpot?虛擬機(jī)才存在永久代草姻。
首先eden區(qū)申請分配空間钓猬,如果空間夠,就直接進(jìn)行分配撩独,否則進(jìn)行一次Minor?GC敞曹。minor?GC?首先會對Eden區(qū)的對象進(jìn)行標(biāo)記账月,標(biāo)記出來存活的對象。然后把存活的對象copy到From s0空間异雁。如果From空間足夠捶障,則回收eden區(qū)可回收的對象。在下一次mirror gc時候纲刀,則把From空間存活的對象和eden中的對象復(fù)制到To區(qū)(但是會有年齡增加),然后將eden和from清空.如果再有mirror gc時候,再將對象復(fù)制到from區(qū)清空eden和to區(qū),知道對象的年齡過大,必須被放到old區(qū).如果老年代空間也不夠(或者達(dá)到觸發(fā)老年年垃圾回收條件的話)則觸發(fā)一次full?GC项炼。
詳細(xì):https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html
6.分析堆棧:
??使用jstack命令查看進(jìn)程的堆棧情況
??jstack?14063?>>jstack.out
查找先關(guān)信息:把jstack.out文件從服務(wù)器拿到本地后,用編輯器查找?guī)в许?xiàng)目目錄并且線程狀態(tài)是RUNABLE的相關(guān)信息示绊。
找到相應(yīng)的代碼锭部,并對它進(jìn)行分析。找出造成這樣的原因