CPU負載過高,內存不足,響應速度慢等很多問題都可以通過JProfile去定位,并且類似這樣的工具還有阿里的Arthas,不過這里想通過清晰的思路和jdk自帶指令去做出相關定位和排查。
JProfile
CPU負載過高問題
- 首先確定當前導致CPU負載過高的PID #top#
- 查詢當前PID進程內線程資源分布情況 #top -Hp 10010#
- 查看資源分布是平均 或者 是某些線程特別霸道(經驗總結來看,分布平均大致是頻繁GC導致,某些線程應該是程序的某些特定操作導致)
- 某些線程資源占用霸道,查看線程正在做什么功能導致,對代碼做出針對性的調整 #jstack -l 10011 | grep 0x271B#
- 每個線程資源占用分布平均,查看當前進程的GC問題,觀看每秒一次的GC狀態,看看是否是GC時某處資源不足導致 #jstat -gcutil 10010 1000 10#
S0,S1區,E區這2個區一般不會有什么問題,除非配置極端不合理
O區資源占用率過高導致FGC,處理方式是進行資源調整或者檢查程序是否有什么異常
M區(1.7以前也叫P區)資源占用率過高,查看是否有過多的class加載#jstat -class 10010# 或者是否有大的對象無法GC#jmap -histo 10010#
JSTAT -GCUTIL
OOM問題
- OutOfMemoryError Java Heap Space 因為Java虛擬機中O區內存不足,可查看程序當前是否出現什么異常。
- OutOfMemoryError PermGen Space 因為M區(P區)內存不足導致,可查看當前是否有大對象生成 #jmap -histo 10010#或者引入的第三方jar太多。#jstat -class 10010#
- OutOfMemoryError Unable to create new native thread 因為每個線程占用資源過高導致沒有內存再創建線程 #-Xss256k#
- OutOfMemoryError GC overhead limit exceeded 因為GC時對象太多導致,設置GC觸發閾值 #-XX:SurvivorRatio(-XX:SurvivorRatio=8) -XX:NewRatio(-XX:NewRatio=4)#
- OutOfStackError 線程內遞歸或迭代調用層數過多導致,線程最小內存JDK1.8以后最小為226k #-Xss256k#