突然发现项目页面打开超级慢,就去服务器上看了看也没有报错,发现cpu占用满了,但是这个服务里并没有太多的业务逻辑,只能查找一波了。
1.top查找出哪个进程消耗的cpu高
直接 top ,发现如图 6415进程占用最高
2.top 占用cpu最高的进程,然后shift+h查找出哪个线程消耗的cpu高
top -p 6415
然后shift+h
然后我们随便找一个线程用jstack分析
3.将需要的线程ID转换为16进制格式:
printf "%x\n" 7065
转化出来是1b99
4.jstack查找这个线程的信息
jstack [进程]|grep -A 10 [线程的16进制] ,即:
jstack 6415|grep -A 10 1b99
-A 10表示查找到所在行的后10行。7065用计算器转换为16进制1b99,注意字母是小写。
结果:
"XNIO-1 task-45" #156 prio=5 os_prio=0 tid=0x00007ff5fc032800 nid=0x1b99 runnable [0x00007ff5c2de9000]
java.lang.Thread.State: RUNNABLE
at java.util.Random.next(Random.java:204)
at java.util.Random.nextDouble(Random.java:532)
at java.lang.Math.random(Math.java:773)
at com.***.***.***.modules.controller.NewsController.random(NewsController.java:854)
at com.***.***.***.modules.controller.NewsController.newsList(NewsController.java:185)
at com.***.***.***.modules.controller.NewsController$$FastClassBySpringCGLIB$$7cb9cc2e.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:749)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
可以帮助定位问题代码,或者给出问题出现的线索。