Java服务,有时候会遇到CPU 100%的问题,对于这样的问题,我们如何快速定位并解决呢?一般会有如下三个步骤:

1、找到最耗CPU的进程

2、找到这个进程中最耗CPU的线程

3、查看堆栈信息,定位线程的什么操作消耗了大量CPU,定位对应代码

下面通过一个实例来详解一下如何快速定位CPU问题

系统:CentOS 7

模拟CPU占用偏高的测试代码:

public class CpuUseTest {

public static void main(String[] args) {

new Thread() {

public void run() {

int result = 0;

while (true) {

result++;

if (result > Integer.MAX_VALUE / 2) {

result = 0;

}

}

}

}.start();

}

}

运行以上代码后,通过以下几步来查找CPU问题:

1、找到最耗CPU的进程

通过top命令查看进程的cpu占用情况,运行top命令后再键入P(大写p),进程会按照CPU使用率排序,如下图:最耗cpu进程

由上图可以看到,最耗CPU的进程PID为2601,CPU使用率达到了100%

2、找到这个进程中最耗CPU的线程

可以使用top命令:

top -Hp ${进程的PID}

也可以使用ps命令:

ps -mp ${进程的PID} -o THREAD,tid,time

我们以top命令为例:

top -Hp 2601

运行以上命令后再键入P(大写p),线程会按照CPU使用率排序,如下图:最耗cpu线程

可以看到进程2601的最耗CPU的线程PID为2611,CPU使用率达到了99.9%

3、查看堆栈信息,定位线程的什么操作消耗了大量CPU,定位对应代码

堆栈里,线程id是用16进制表示的,所以需要将线程PID转化为16进制:

printf "%x\n" 2611

输出:

a33

打印进程堆栈信息(注意2601是进程的PID),通过线程id,过滤得到线程堆栈:

jstack 2601 | grep a33 -A 20

输出信息如下:堆栈信息

由此可以看到,最耗CPU的代码为CpuUseTest.java代码中的第9行,也就是执行无限循环的代码块所在的位置。

直此导致该应用CPU偏高的问题,被成功定位。

4、查看堆栈信息中遇到的问题

刚开始查看堆栈信息的时候,使用了如下命令(请跟上面的命令对比一下,看看有什么不同):

jstack 2611 | grep a33 -A 20

结果报错:堆栈信息报错

是的,我把该写进程PID的地方,写成了线程PID,找了一圈,才解决这个问题,也耗费了不少时间。

java 100% cpu_Java服务,CPU 100%问题如何快速定位?相关推荐

  1. java 100% cpu_Java服务,CPU100%问题如何快速定位?

    假设,服务器上部署了若干Java站点服务,以及若干Java微服务,突然收到运维的CPU异常告警.如何定位是哪个服务进程导致CPU过载,哪个线程导致CPU过载,哪段代码导致CPU过载? 简要步骤如下: ...

  2. 一键定位java 线上服务 CPU 100%

    传统方法: top oder by with P:1040 // 首先按进程负载排序找到 axLoad(pid) top -Hp 进程PID:1073 // 找到相关负载 线程PID printf & ...

  3. 线上服务 CPU 100%?一键定位 so easy!

    0.背景 经常做后端服务开发的同学,或多或少都遇到过 CPU 负载特别高的问题.尤其是在周末或大半夜,突然群里有人反馈线上机器负载特别高,不熟悉定位流程和思路的同学可能登上服务器一通手忙脚乱,定位过程 ...

  4. 线上服务 CPU 100% ?一键定位 so easy!

    点击上方 "编程技术圈"关注, 星标或置顶一起成长 后台回复"大礼包"有惊喜礼包! 每日英文 A man should have one dream at le ...

  5. 运行php程序cpu 100%,php 应用 cpu 100% 调试方法

    找出进程占用cpu高的原因. 进程占用cpu高,一般是由于进程长时间占用cpu,又没有主动释放占用.如果想主动释放cpu,可以调用sleep.在写程序的时候,尤其要注意while 等循环的地方. 找出 ...

  6. Java服务,CPU100%问题如何快速定位?

    上篇<Java服务,内存OOM问题如何快速定位?>发布后,有朋友在评论留言,问CPU100%的性能问题,如何找到相关服务,如何定位问题代码,也非常考验技术人的功底,今天简单说下思路. 假设 ...

  7. JAVA I/O之神奇的RandomAccessFile(快速定位文件任意位置,修改或插入)

    一.简述 这个是JDK上的截图,我们可以看到它的父类是Object,没有继承字节流.字符流家族中任何一个类.并且它实现了DataInput.DataOutput这两个接口,也就意味着这个类既可以读也可 ...

  8. 线上服务 CPU 又 100% 啦?一键定位 so easy!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:my.oschina.net/leejun2005/blog ...

  9. 多事之秋-最近在阿里云上遇到的问题:负载均衡失灵、服务器 CPU 100%、被 DDoS 攻击...

    昨天 22:00~22:30 左右与 23:30~00:30 左右,有1台服役多年的阿里云负载均衡突然失灵,造成通过这台负载均衡访问博客站点的用户遭遇 502, 503, 504 ,由此给您带来麻烦, ...

最新文章

  1. Spads 公式解析系统 - Java
  2. 【FPGA】ODDR使用研究记录
  3. Android 打印方法调用堆栈
  4. Dijkstra算法的另一种证明
  5. 雷军做程序员时写的博客,太牛了。。
  6. python空格_python 空格
  7. JavaEE PO VO BO DTO POJO DAO 整理总结(转)
  8. 重装win7后修改桌面路径到D盘
  9. HDOJ 1896 Stones 解题报告
  10. Django中的F对象和Q对象
  11. 曝Redmi Note 9系列下周发布:最便宜的一亿像素手机
  12. python是干嘛的-python语言是干什么的
  13. tensorflow之成品模型
  14. osql 登陆mysql_命令行登录mysql报Segmentation fault故障解决
  15. c语言-树的基础知识
  16. 【B2B】阿里巴巴汪海:1688成年礼—从中小企业数字化看B2B发展趋势
  17. ESLint 格式化程序
  18. 如何优雅的修改 Kubernetes Master 节点 IP?可没你想象中那么简单!
  19. linux 计算程序运行时间
  20. word2vec中数学原理详解以及原理思考

热门文章

  1. cxf javax.xml.parsers.DocumentBuilderFactory.setFeature(Ljava/lang/String;Z)
  2. Mysql和Oracle 数据库操作工具类
  3. Java-增强for循环
  4. 在腾讯云开通短信验证服务设置正确格式的签名和正文模板并完成群发消息测试
  5. linux oracle11g开机,Linux 下Oracle11g 自动随系统启动
  6. 设置线程当天十二点执行_这份JAVA多线程笔记真的是细节满满,几乎全是你工作能用到的干货...
  7. oracle schema_了解Oracle备份恢复的知识
  8. 福建学业水平测试计算机考点大纲,福建高中信息技术学业水平考试说明大纲
  9. C语言实现用星号在屏幕上打印菱形
  10. element upload预览_vue element upload实现图片本地预览