定位及思考CPU负载过高 & OOM 问题
2019-02-14 本文已影响11人
TTTTTriM
JProfileCPU负载过高,内存不足,响应速度慢等很多问题都可以通过JProfile去定位,并且类似这样的工具还有阿里的Arthas,不过这里想通过清晰的思路和jdk自带指令去做出相关定位和排查。
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#