JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

javaCPU飙升怎么解决

wys521 2024-12-02 18:33:23 精选教程 25 ℃ 0 评论



概念

cpu是时分(time division)的,操作系统里有很多线程,每个线程的运行时间由cpu决定,cpu会分给每个线程一个时间片,时间片是一个很短的时间长度,如果在时间片内,线程一直占有,则是100%;我们应该意识到,cpu运行速度很快

飙升原因

频繁GC,当访问量过高时,可能会造成频繁的GC,甚至FGC,内存分配过快,GC线程不停执行

序列化与反序列化,xml文档或word文档解析时

加密、解密

线程上下文切换,阻塞、IO、执行状态变化,锁的竞争激烈

死循环、while(true)

定位概念

查消耗cpu最高的进程PID

top -c:执行top -c ,显示进程运行信息列表。按下P,进程按照cpu使用率排序

top -Hp 3033:显示一个进程的线程运行信息列表。按下P,进程按照cpu使用率排序

jps

根据PID查出消耗cpu最高的线程号

jstack -l 3033 > ./3033.stack

根据线程号查出对应的java线程,进行处理

cat 3033.stack |grep 'bda' -C 8

解决过程

1.执行“top”命令:查看所有进程占系统CPU的排序。极大可能排第一个的就是咱们的java进程(COMMAND列)。PID那一列就是进程号。

2.执行“top -Hp 进程号”命令:查看java进程下的所有线程占CPU的情况。

3.执行“printf "%x\n 10"命令 :后续查看线程堆栈信息展示的都是十六进制,为了找到咱们的线程堆栈信息,咱们需要把线程号转成16进制。例如,printf "%x\n 10-》打印:a,那么在jstack中线程号就是0xa.

4.执行 “jstack 进程号 | grep 线程ID” 查找某进程下-》线程ID(jstack堆栈信息中的nid)=0xa的线程堆栈信息。如果“"VM Thread" os_prio=0 tid=0x00007f871806e000 nid=0xa runnable”,第一个双引号圈起来的就是线程名,如果是“VM Thread”这就是虚拟机GC回收线程了

5.执行“jstat -gcutil 进程号 统计间隔毫秒 统计次数(缺省代表一致统计)”,查看某进程GC持续变化情况,如果发现返回中FGC很大且一直增大-》确认Full GC! 也可以使用“jmap -heap 进程ID”查看一下进程的堆内从是不是要溢出了,特别是老年代内从使用情况一般是达到阈值(具体看垃圾回收器和启动时配置的阈值)就会进程Full GC。

6.执行“jmap -dump:format=b,file=filename 进程ID”,导出某进程下内存heap输出到文件中。可以通过eclipse的mat工具查看内存中有哪些对象比较多。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表