本次应用投产后,生产报告cpu使用率过高,经常100%:
参考网上资料,经排查后解决。现将思路分享出来:
名词解释:
pid 进程ID,tid 线程ID
1. top -d 1命令查看 当前占用cpu资源最多的,找到pid
2. ps -mp pid -o THREAD,tid,time命令查看该进程的线程情况,找到tid
3. printf "%x\n" tId 将tid转成16进制 0xtid
4. jstack pid|grep 0xtid -A 30 ----查看具体堆栈信息,从栈中找到对应的代码段
5. 根据找到的代码段,进行具体的分析。
分析步骤:
1.登陆应用机器,top -d 1命令查看 当前占用cpu资源最多的,一般排名第一位肯定是java进程
一般也可能存在多个java进程

2.查看进程的哪个线程占用cpu比较高,取线上另外一台正常情况下利用cpu比较高的应用:通过
ps -mp pid -o THREAD,tid,time命令查看该进程的线程情况
ps -mp 1679 -o THREAD,tid,time


通过以上线程CPU切片 耗时在pid=1679 Tid =1896 耗时 1分59秒,4%CPU占用最大。时间最长。
TID为1679的线程利用cpu资源比较多,怎么能看到这个线程在干什么呢?
需要将1896 转换为16进制,便于在jvm堆栈中查找。
printf "%x\n" 1896
计算出对应16进制为 768
通过jstack命令来查看下当前内存状态:
jstack 1679|grep 768 -A 30

定位到cpu过高是IO读写太高 ,接下来就是找开发人员确认这段代码是否可以优化。
----------------------------------补充知识---------------------------------------
1、CPU 使用率怎么计算?
CPU% = 1 - idleTime sysTime * 100
idleTime:CPU处于空闲状态的时间
sysTime:CPU处于用户态和内核态的时间总和
2、CPU 使用率跟啥有关系?
计算密集型的程序是比较耗 CPU 使用率的。
JAVA 应用中哪些操作是比较耗 CPU 使用的?
列举日常程序中常见的耗CPU的操作:
A. 频繁GC,访问量高时,有可能造成频繁的GC、甚至FGC。当调用量大时,内存分配过快,就会造成GC线程不停的执行,导致CPU飙高
B. 序列化与反序列化,后文中举了一个真实的案例,程序执行xml解析的时,调用量增大的情况下,导致了CPU被打满
C. 加密、解密
D. 正则表达式校验,曾经线上发生一次血案,正则校验将CPU打满。大概原因是:Java 正则表达式使用的引擎实现是 NFA 自动机,这种引擎在进行字符匹配会发生回溯(backtracking)
E. 线程上下文切换、当启动了很多线程,而这些线程都处于不断的阻塞状态(锁等待、IO等待等)和执行状态的变化过程中。当锁竞争激烈时,很容易出现这种情况
F.某些线程在做无阻塞的运算,简单的例子while(true)中不停的做运算,没有任何阻塞。写程序时,如果需要做很久的计算,可以适当将程序sleep下。
比如在循环中不断计算:
修改前:

对应的计算如下:

修改后:





