[原]调试实战——程序CPU占用率飙升,你知道如何快速定位吗?
前言
如果我们自己的程序的CPU Usage(CPU占用率)飙升,并且居高不下,很有可能陷入了死循环。你知道怎么快速定位并解决吗?今天跟大家分享几种定位方法,希望对你有所帮助。
如何判断是否有死循环?
通过电脑风扇的声音猜测。
如果风扇一直响个不停,说明电脑很热。高
CPU占用率会导致CPU发热量增大,从而导致风扇狂响。如果听到风扇响个不停,可以打开任务管理器看看CPU占用率是不是很高。如果发现是我们的进程导致的高CPU占用率,那么可以进一步查看是不是有死循环。通过
CPU占用率来判断。对于多核
CPU(尤其是性能强劲的CPU),一个核心的满负荷运转,并不会立刻导致CPU发热量明显增大,风扇可能不会有明显响动。这时根据风扇声音不能轻易判断出是否有死循环,但是我们可以通过CPU占用率来判断。如果
CPU是单核的,那么当CPU处于满负荷运转状态,CPU占用率会接近100%。如果CPU是4核的,并且这4个核心都处于满负荷运转状态,那么CPU占用率会接近100%,如果只有一个核心是满负荷运转状态,那么CPU占用率会在25%(100 / 4 = 25)左右。如果我们发现某个进程的CPU占用率居高不下,有可能是死循环了。{% note info %}
注意: 很多死循环都是busy类型的,如果是idle类型的死循环,上面的方法不适用。
{% endnote %}
下面介绍几个我经常使用的工具,可以比较便捷的排查此类的问题。
1. process explorer
在前面的文章里跟大家介绍过,使用process explorer可以查看线程的调用栈及CPU占用率。如果程序里的某个功能迟迟不能完成,我的第一反应是,按Ctrl + Shift + Esc打开任务管理器(我已经使用process explorer替换了系统自带的任务管理器,所以启动的是process explorer。如何使用process explorer替换系统自带的任务管理器,请参考文章排错实战——使用process explorer替换任务管理器)。
启动process explorer后,双击我们关心的进程,切换到Thread页,在这里我们可以看到当前进程中的所有线程。双击某个线程就可以查看调用栈,在弹出的调用栈界面,点击左下角的Refresh按钮可以刷新。
如果每次刷新都能看到某个函数,很有可能是在这个函数中出现了死循环。对照源码,也许能直接能看出原因。

{% note info %}
注意: 需要正确加载调试符号才可以看到对应的函数名。
{% endnote %}
2. windbg
如果不能使用process explorer定位到具体的原因,可以使用windbg附加到进程中进行更深入的调查。我们需要找出哪个线程运行的时间最长,因为一般死循环的线程占用的CPU时间会比较长。应该怎么找呢?
[原]调试实战——程序CPU占用率飙升,你知道如何快速定位吗?的更多相关文章
- 使用jstack分析java程序cpu占用率过高
在项目中经常会碰到CPU占用率过高的问题,那么碰到这类问题应当如何处理呢?下面提供一种处理思路: 首先top -H -p <pid>以线程的模式查看java应用的运行情况,找到占用cpu或 ...
- 使用jvisualvm和飞行记录器分析Java程序cpu占用率过高
一.jvisualvm使用 JDK1.6中Oracle提供了一个新的JVM监控工具:jvisualvm.下面重点介绍如何在本地通过远程的方式打开Linux服务器上的jvisualvm. 1.Xmana ...
- 线上Java程序导致服务器CPU占用率过高的问题排除过程
博文转至:http://www.jianshu.com/p/3667157d63bb,博文更好效果看原版,转本博文的目的就算是个书签吧,需要时候可以定位原文学习 1.故障现象 客服同事反馈平台系统运行 ...
- 记一次线上Java程序导致服务器CPU占用率过高的问题排除过程
博文转至:http://www.jianshu.com/p/3667157d63bb,转本博文的目的就是需要的时候以防忘记 1.故障现象 客服同事反馈平台系统运行缓慢,网页卡顿严重,多次重启系统后问题 ...
- 编程之美_1.1 让CPU占用率曲线听你指挥
听到有人说让要写一个程序,让用户来决定Windows任务管理器的CPU占用率. 觉得很好奇.但第一个想法就是写个死循环.哈哈.不知道具体的占用率是多少,但至少能保证在程序运行时,CPU的占用率终会稳定 ...
- 《编程之美》学习笔记——指挥CPU占用率
问题: 写一个程序.让用户来决定Windows任务管理器(Task Manager)的CPU占用率(单核). 有下面几种情况: 1.CPU占用率固定在50%,为一条直线 2.CPU的占用率为一条直线, ...
- linux上限制用户进程数、cpu占用率、内存使用率
限制进程CPU占用率的问题,给出了一个shell脚本代码如下: renice +10 `ps aux | awk '{ if ($3 > 0.8 && id -u $1 > ...
- 浅析 Pycharm 内存、cpu 占用率
浅析 Pycharm 内存.cpu 占用率 本机配置参数: ------------------------------------------ Windows 10 专业版 X64 ----- ...
- C#获取CPU占用率、内存占用、磁盘占用、进程信息
代码: using System; using System.Collections.Generic; using System.Diagnostics; using System.Threading ...
随机推荐
- CV_图像滤波[转]---python+opencv均值滤波,高斯滤波,中值滤波,双边滤波
1.图像滤波算法(cv2) https://blog.csdn.net/qq_27261889/article/details/80822270 2.
- struts2 result随笔
一.result:chain(从一个Action转发到另一个Action) chain结果类型有4个属性,分别是: actionName (default) - the name of the ac ...
- PHP - 接收检验验证码 , 以JSON的形式将验证结果返回给前端
<?php session_start(); $codeT = strtoupper(trim($_POST['codeT']));//接收前端传来的数据,转换成大写 $raw ...
- Mobile-H5网页快速滚动和回弹
现在很多for Mobile的HTML5网页内都有快速滚动和回弹的效果,看上去和原生app的效率都有得一拼. 要实现这个效果很简单,只需要加一行css代码即可: -webkit-overflow-sc ...
- 【Tensorflow】(tf.Graph)和(tf.session)
图(tf.Graph):计算图,主要用于构建网络,本身不进行任何实际的计算. 会话(tf.session):会话,主要用于执行网络.所有关于神经网络的计算都在这里进行,它执行的依据是计算图或者计算图的 ...
- java笔记01
java对象数组 Student[] Students = new Student[3]; 与普通数组无差 java集合类 集合类: 面向对象对事物的描述是通过对象来体现的. 为了方便对多个对象进行操 ...
- SrpingMVC/SpringBoot中restful接口序列化json的时候使用Jackson将空字段,空字符串不传递给前端
笔者的JSON如下: { "code": 10001, "message": "成功", "nextUrl": null ...
- mybatis的插入数据后的主键获取
为什么要在插入数据后获取主键:当有一个订单表和订单详情表,当插入订单表的数据后,需要在订单详情表插入该订单的具体购物情况,订单详情表需要的一个列是订单表的主键或者订单ID.(通俗讲:A表的主键是B表的 ...
- ArchLinux安装KDE桌面
ArchLinux安装KDE桌面 一.链接网络 1.有线 # dhcpcd 2.无线 # wifi-menu 3.检查 # ping www.baidu.com 二.安装X服务 # pacman -S ...
- 谈IO中的阻塞和非阻塞,同步和异步及三种IO模型
什么是同步和异步? 烧水,我们都是通过热水壶来烧水的.在很久之前,科技还没有这么发达的时候,如果我们要烧水,需要把水壶放到火炉上,我们通过观察水壶内的水的沸腾程度来判断水有没有烧开.随着科技的发展,现 ...