定位及思考CPU負載過高 & OOM 問題

CPU負載過高,內存不足,響應速度慢等很多問題都可以通過JProfile去定位,并且類似這樣的工具還有阿里的Arthas,不過這里想通過清晰的思路和jdk自帶指令去做出相關定位和排查。

JProfile

CPU負載過高問題

  1. 首先確定當前導致CPU負載過高的PID #top#
  2. 查詢當前PID進程內線程資源分布情況 #top -Hp 10010#
  3. 查看資源分布是平均 或者 是某些線程特別霸道(經驗總結來看,分布平均大致是頻繁GC導致,某些線程應該是程序的某些特定操作導致)
  4. 某些線程資源占用霸道,查看線程正在做什么功能導致,對代碼做出針對性的調整 #jstack -l 10011 | grep 0x271B#
  5. 每個線程資源占用分布平均,查看當前進程的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問題

  1. OutOfMemoryError Java Heap Space 因為Java虛擬機中O區內存不足,可查看程序當前是否出現什么異常。
  2. OutOfMemoryError PermGen Space 因為M區(P區)內存不足導致,可查看當前是否有大對象生成 #jmap -histo 10010#或者引入的第三方jar太多。#jstat -class 10010#
  3. OutOfMemoryError Unable to create new native thread 因為每個線程占用資源過高導致沒有內存再創建線程 #-Xss256k#
  4. OutOfMemoryError GC overhead limit exceeded 因為GC時對象太多導致,設置GC觸發閾值 #-XX:SurvivorRatio(-XX:SurvivorRatio=8) -XX:NewRatio(-XX:NewRatio=4)#
  5. OutOfStackError 線程內遞歸或迭代調用層數過多導致,線程最小內存JDK1.8以后最小為226k #-Xss256k#
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。