一、linux下查找java程序占用cpu過高原因
1.檢視程序
top指令檢視程序占用資源情況
2.查找線程
top -H -p <pid>檢視線程占用情況
ps -mp pid(程序id) -o THREAD,tid,time 檢視線程清單
3.查找java的堆棧資訊
将線程id轉換成十六進制
printf "%x\n" 15664
4.使用jstack查詢線程堆棧資訊
jstack <pid> | grep -A 20 線程id(十六進制) 定位到線程ID的後20行
5.分析原因和修改代碼
二、線上服務記憶體OOM問題定位
jmap -heap 10765
#檢視程序新生代、老年代堆記憶體的配置設定大小以及使用情況,看是否本身配置設定過小。
jmap -histo:live 10765 | more
#找到最消耗記憶體的對象。
jmap -dump:live,format=b,file=dump.hprof 程序id
#jmap指令dump出堆裡的對象檔案,使用jprofiler、visalVM、eclipse mat分析記憶體對象情況。
三、full gc問題排查
老年代空間不足
永生代或者中繼資料空間不足
System.gc()方法調用
CMS GC時出現promotion failed和concurrent mode failure
YoungGC時晉升老年代的記憶體平均值大于老年代剩餘空間
有連續的大對象需要配置設定
jstat -gcutil 9596 250 12
#程序9596每隔250ms列印一次,列印12次。
jstat -gccause pid
#檢視gc詳細原因
jmap -histo 程序id > jmap.txt
#dump檔案分析,找到占用記憶體的對象,定位到具體code。