排查Java的CPU性能问题

求阙者

关注

阅读 69

2022-07-27


最近在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/下

排查Java的CPU性能问题_cpu

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命令具体参数

排查Java的CPU性能问题_busy_02

更加详细的讲解:​​show-busy-java-threads​​

个人微信公众号:

排查Java的CPU性能问题_spring_03

作者:jiankunking


精彩评论(0)

0 0 举报