java进程CPU占用率过高问题排查过程

1 问题描述

在服务器上使用top命令发现一个java 进程CPU占用率拉满。
在这里插入图片描述

2 排查过程

2.1 查看java进程的线程占用率

top -H -p 3815080

在这里插入图片描述
发现pid为3815448的线程cpu占用率异常高。

2.2 查看线程执行状况

jstack -F 3815080 | grep 3815448 -A 20

在这里插入图片描述
定位到具体的类,并且发现执行到第59行,则定位代码:

			while (true) {
                if (!isConnected) {
                    try {
                        init();
                        TimeUnit.SECONDS.sleep(10);
                    } catch (Exception e) {
                        log.error("", e);
                        throw new RuntimeException(e);
                    }
                }
            }

这段代码是用来判断连接是否断开,如果断开则需要重新连接。但是如果连接正常,则会导致死循环,占用CPU。至此定位到问题。

3 代码优化

			while (true) {
                if (!isConnected) {
                    try {
                        init();
                        TimeUnit.SECONDS.sleep(10);
                    } catch (Exception e) {
                        log.error("", e);
                        throw new RuntimeException(e);
                    }
                }else{
                    //如果没有连接还保持着,则休眠30s,防止cpu沾满
                    try {
                        Thread.sleep(30000L);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }
            }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值