首页 > 后端开发 > 正文

Java中CPU占用过高问题如何解决

2024-06-01 04:31:35 | 我爱编程网

今天我爱编程网小编整理了Java中CPU占用过高问题如何解决相关信息,希望在这方面能够更好的大家。

本文目录一览:

Java中CPU占用过高问题如何解决

Java中CPU占用过高问题如何解决

方法1

1.jps 获取Java进程的PID。

2.jstack pid >> java.txt 导出CPU占用高进程的线程栈。

3.top -H -p PID 查看对应进程的哪个线程占用CPU过高。

4.echo “obase=16; PID” | bc 将线程的PID转换为16进制,大写转换为小写。

5.在第二步导出的Java.txt中查找转换成为16进制的线程PID。找到对应的线程栈。

6.分析负载高的线程栈都是什么业务操作。优化程序并处理问题。

方法2

1.使用top 定位到占用CPU高的进程PID

top

通过ps aux | grep PID命令

2.获取线程信息,并找到占用CPU高的线程

ps -mp pid -o THREAD,tid,time | sort -rn

3.将需要的线程ID转换为16进制格式

printf "%x\n" tid

4.打印线程的堆栈信息

jstack pid |grep tid -A 30

Java中CPU占用过高问题如何解决

面试官:Tomcat 进程占用 CPU 过高怎么办?

CPU经常会成为系统性能的瓶颈,可能:

通常所说的CPU使用率过高,隐含着一个用来比较高与低的基准值,比如

通常所说的CPU使用率过高,隐含着一个用来比较高与低的基准值,比如

最重要的是找到哪些线程在消耗CPU,通过线程栈定位到问题代码

如果没有找到个别线程的CPU使用率特别高,考虑是否线程上下文切换导致了CPU使用率过高。

程序模拟CPU使用率过高 - 在线程池中创建4096个线程

在Linux环境下启动程序:

java -Xss256k -jar demo-0.0.1-SNAPSHOT.jar

线程栈大小指定为256KB。对于测试程序来说,操作系统默认值8192KB过大,因为需要创建4096个线程。

使用top命令,我们看到Java进程的CPU使用率达到了961.6%,注意到进程ID是55790。

用更精细化的top命令查看这个Java进程中各线程使用CPU的情况:

可见,有个叫“scheduling-1”的线程占用了较多的CPU,达到了42.5%。因此下一步我们要找出这个线程在做什么事情。

打开55790.log,定位到第4步中找到的名为

scheduling-1

的线程,其线程栈:

看到AbstractExecutorService#submit这个函数调用,说明它是Spring Boot启动的周期性任务线程,向线程池中提交任务,该线程消耗了大量CPU。

经历上述过程,往往已经可以定位到大量消耗CPU的线程及bug代码,比如死循环。但对于该案例:Java进程占用的CPU是961.6%, 而“scheduling-1”线程只占用了42.5%的CPU,那其它CPU被谁占用了?

第4步用top -H -p pid命令看到的线程列表中还有许多名为“pool-1-thread-x”的线程,它们单个的CPU使用率不高,但是似乎数量比较多。你可能已经猜到,这些就是线程池中干活的线程。那剩下的CPU是不是被这些线程消耗了呢?

还需要看jstack的输出结果,主要是看这些线程池中的线程是不是真的在干活,还是在“休息”呢?

发现这些“pool-1-thread-x”线程基本都处WAITING状态发现这些“pool-1-thread-x”线程基本都处WAITING状态

回到我们的“pool-1-thread-x”线程,这些线程都处在“Waiting”状态,从线程栈我们看到,这些线程“等待”在getTask方法调用上,线程尝试从线程池的队列中取任务,但是队列为空,所以通过LockSupport.park调用进到了“Waiting”状态。那“pool-1-thread-x”线程有多少个呢?通过下面这个命令来统计一下,结果是4096,正好跟线程池中的线程数相等。

剩下CPU到底被谁消耗了?

应该怀疑CPU的上下文切换开销了,因为我们看到Java进程中的线程数比较多。

下面通过vmstat命令来查看一下操作系统层面的线程上下文切换活动:

cs那一栏表示线程上下文切换次数,in表示CPU中断次数,我们发现这两个数字非常高,基本证实了我们的猜测,线程上下文切切换消耗了大量CPU。

那具体是哪个进程导致的呢?

停止Spring Boot程序,再次运行vmstat命令,会看到in和cs都大幅下降,这就证实引起线程上下文切换开销的Java进程正是55790。

遇到CPU过高,首先定位哪个进程导致的,之后可以通过top -H -p pid命令定位到具体的线程。

其次还要通jstack查看线程的状态,看看线程的个数或者线程的状态,如果线程数过多,可以怀疑是线程上下文切换的开销,我们可以通过vmstat和pidstat这两个工具进行确认。

Java中CPU占用过高问题如何解决

LinuxJAVA进程CPU使用时间短linuxjava进程

linux有一个java进程cpu达到100,怎么回事,程序进程多?

cpu使用率高的原因及解决方法:第一、杀毒软件,常见的金山、瑞星杀毒软件会对网页、插件等进行监控,这样就增大了系统负担,自然也就会造成cpu使用率高。第二、驱动不达标,现在人们使用的驱动有几大一部分是属于测试版的驱动,这一类驱动并不合格,它可以造成CPU100%的使用率,而且不容易发觉。第三、病毒木马,病毒在系统内部复制,必然造成极高的cpu占有率;第四、网络链接,这是最直接的客观原因,主要是网络连接不稳定。第五、启动项太多,一般来说开机启动项过多,就会增加cpu的使用率,增加其荷载。第六、桌面尽量少放文件,在桌面上放过多的文件,极大的占用cpu,造成使用率过高。第七、软件本身需要占有很高的CPU,比如一览器;有时有的软件和系统会有点不兼容。第八、“svchost”进程影响,svchost.exe是系统的一个核心进程,svchost.exe有时非常令人头痛,如果看到某个svchost.exe占用很大CPU,这时可以去下aports或者fport来检察其对应的程序路径,看下是不是有程序调用svchost.exe。第九、右击文件100%_使用率,这个也是非常常见,在官方解释也很有意思。第十、cpu温度过高,证明cpu本身就是出于不正常运行,自然也就会导致异常。第十一、word文件过大,cpu对其拼写和语法检查过度。我爱编程网

以上就是我爱编程网小编给大家带来的Java中CPU占用过高问题如何解决全部内容,希望对大家有所帮助!

免责声明:文章内容来自网络,如有侵权请及时联系删除。
与“Java中CPU占用过高问题如何解决”相关推荐