定位及思考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#

你可能感兴趣的:(定位及思考CPU负载过高 & OOM 问题)