最近在github上看到了一个很实用一些脚本,github地址: https://github.com/jiankunking/useful-scripts
其中有一个(show-busy-java-threads)用于快速排查Java的CPU性能问题(top us值过高),自动查出运行的Java进程中消耗CPU多的线程,并打印出其线程栈,从而确定导致性能问题的方法调用。
于是尝试了一把,具体案例:Java CPU 占用高 模拟及排查
1、下载脚本
git clone git://github.com/jiankunking/useful-scripts.git
cd useful-scripts
# 使用Release分支的内容
git checkout release
# 更新脚本
git pull
2、脚本位置移动 将useful-scripts中内容cp到$HOME/bin/下
3、查找最占资源的线程
// 从所有运行的Java进程中找出最消耗CPU的线程(缺省5个),打印出其线程栈
show-busy-java-threads
结果如下:
jiankunking@ubuntu:/$ show-busy-java-threads
[1] Busy(96.6%) thread(2881/0xb41) stack of java process(2880) under user(jiankunking):
"main" #1 prio=5 os_prio=0 tid=0x00007f0afc009800 nid=0xb41 runnable [0x00007f0b0345e000]
java.lang.Thread.State: RUNNABLE
//问题原因
at com.jiankunking.cpu.cpuReaper.cpuReaper(cpuReaper.java:22)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:369)
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:312)
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:135)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:423)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1702)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:583)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:502)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:312)
at org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$73/466002798.getObject(Unknown Source)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
- locked (a java.util.concurrent.ConcurrentHashMap)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:310)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:760)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:868)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549)
- locked (a java.lang.Object)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:388)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:327)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1246)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1234)
at com.jiankunking.CpuMemOccupySimulateApplication.main(CpuMemOccupySimulateApplication.java:11)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)
[2] Busy(0.1%) thread(2886/0xb46) stack of java process(2880) under user(jiankunking):
"C2 CompilerThread0" #5 daemon prio=9 os_prio=0 tid=0x00007f0afc0d6000 nid=0xb46 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
[3] Busy(0.0%) thread(3498/0xdaa) stack of java process(2880) under user(jiankunking):
"Attach Listener" #11 daemon prio=9 os_prio=0 tid=0x00007f0adc001000 nid=0xdaa waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
[4] Busy(0.0%) thread(2889/0xb49) stack of java process(2880) under user(jiankunking):
"VM Periodic Task Thread" os_prio=0 tid=0x00007f0afc0e6800 nid=0xb49 waiting on condition
[5] Busy(0.0%) thread(2888/0xb48) stack of java process(2880) under user(jiankunking):
"Service Thread" #7 daemon prio=9 os_prio=0 tid=0x00007f0afc0e3800 nid=0xb48 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
jiankunking@ubuntu:/$
4、show-busy-java-threads命令具体参数
更加详细的讲解:show-busy-java-threads
个人微信公众号:
作者:jiankunking 出处:http://blog.csdn.net/jiankunking