如何解决java程序CPU负载过高问题

1、介绍

在生产环境中,有时会遇到cpu占用过高且一直下不去的场景。这种情况可能会导致服务器宕机,进而中断对外服务,也会影响硬件寿命。

2、原因

1、Java代码存在因递归不当等原因导致的死循环的问题,推荐有条件的循环;
2、Jav代码存在因创建线程过多而造成频繁的上下文切换,进而消耗CPU资源问题,推荐根据业务合理建立线程池;
3、Java虚拟机线程(如GC线程、编译线程)频繁执行,查找原因减低GC频率;

3、定位

定位问题步骤:
1)定位进程:通过“top”命令找到系统中CPU占用率比较高的进程ID;
2)定位线程:通过“top -Hp 线程ID”命令在指定的进程中寻找进程CPU占用率比较高的线程ID;
3)定位代码:通过“jstack 线程ID”搜索打印出的进程堆栈日志,进而定位到具体的问题;

3.1 定位进程

通过“top”命令找到系统重cpu占用率比较高的进程ID.

[root@localhost ~]# top

说明:top是一个Linux系统中常用的性能分析工具,能够近试试(默认每隔3秒刷新)地显示系统内各进程的资源(如CPU、内存等)占用状况,类似于windows的任务管理器。
该命令可以按CPU使用、内存使用和执行时间对任务进行排序。
shift+P:根据CPU消耗排序,
shift+M:根据内存消耗排序。
以下是执行top命令后显示的信息:
image.png

3.2 定位线程

发现60388这个进程占用CPU比较高,执行以下命令来定位是哪个线程占用较高

[root@localhost ~]# top -Hp 60388

image.png
发现61200这个线程占用CPU比较高

3.3 定位代码

1、获取某个进程堆栈快照信息

# 注意是进程ID
[root@localhost ~]# jstack 60388 > /opt/cpu.info

说明:
jstack用于获取某个Java进程内各个Java线程的堆栈跟踪快照信息。
image.png
这个命令执行完后,就会在指定的位置生成cpu.info文件,这个文件里面就收集到当前进程所有线程的信息。

2、获取61200这个线程对应的16进制表示

[root@localhost ~]# printf "%x\n" 61200
ef10

image.png

3、在文件中搜索过滤并打印含ef10的日志数据

[root@localhost ~]# cat /opt/cpu.info | grep -A 30 ef10

image.png
定位到具体哪一行
image.png

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值