背景
12.19日其中一个Java进程发版后,部署节点cpu占用率上涨50%告警
步骤
步骤一:找到进程ID
ps -ef|grep 'java' 或者 jps
步骤二:找到进程消耗内存多的线程ID(TID)
ps -Lfp [PID] 或者 top -Hp [PID]
步骤三:线程TID转换16进制
printf "%x\n" [19371]
Jstack排查线程执行点
jstack pid | grep -C[显示上下行数] tid >jstack.log
实例:jstack 19370|grep -C20 467b > jstack.log
定位代码问题
代码Test.java第6行消耗CPU高
结论
一般出现CPU消耗高,可能会是以下原因导致
1、频繁的GC; 如果访问量很高,可能会导致频繁的GC甚至FGC。当调用量很大时,内存分配将如此之快以至于GC线程将连续执行,这将导致CPU飙升。
2、序列化和反序列化。稍后将给出一个示例:当程序执行xml解析时,调用量会增加,从而导致CPU变满。
3、正则表达式。我遇到了正则表达式使CPU充满的情况; 原因可能是Java正则表达式使用的引擎实现是NFA自动机,它将在字符匹配期间执行回溯。
4、线程上下文切换; 有许多已启动的线程,这些线程的状态在Blocked(锁定等待,IO等待等)和Running之间发生变化。当锁争用激烈时,这种情况很容易发生,锁的竞争,引起上下文切换x
5、有些线程正在执行非阻塞操作,死循环,例如 ,while(true)语句。如果在程序中计算需要很长时间,则可以使线程休眠。