排查Java的CPU性能问题

最近在github上看到了一个很实用一些脚本,github地址:
https://github.com/oldratlee/useful-scripts

其中有一个(show-busy-java-threads)用于快速排查Java的CPU性能问题(top us值过高),自动查出运行的Java进程中消耗CPU多的线程,并打印出其线程栈,从而确定导致性能问题的方法调用。

于是尝试了一把,具体案例:Java CPU 占用高 模拟及排查

1、下载脚本

git clone git://github.com/oldratlee/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 <0x00000000ca264288> (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 <0x00000000ca240f40> (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

猜你喜欢

转载自blog.csdn.net/xunzaosiyecao/article/details/80297136