**这篇文档主要介绍生产服务器上部署了几个java程序,突然出现了CPU100%的异常告警,应该如何定位排查问题。**
下面给出两种系统下的排查步骤,都是一模一样的,只是命令稍有区别!
* 查消耗cpu最高的进程PID
* 根据PID查出消耗cpu最高的线程号
* 根据线程号查出对应的java线程,进行处理
准备一行死循环代码:
![](https://img.kancloud.cn/0d/47/0d47f3621ed770f330fb35e9901fd0a1_500x240.png)
<br/>
<br/>
### 一、Windows 版
<br/>
#### 1.查消耗cpu最高的进程PID
我以win 10为例,截图给大家看一下,先调出PID显示项
![](https://img.kancloud.cn/2e/e0/2ee01fff43e41ef62fd6a14be24dc550_674x657.png)
然后发现进程PID如下图所示,为4152
![](https://img.kancloud.cn/b9/68/b96815a95f5ac1a8608d01312126879b_687x661.png)
<br/>
<br/>
#### 2.根据PID查出消耗cpu最高的线程号
这里用到微软的工具Process Explorer v16.22,地址如下
[https://docs.microsoft.com/zh-cn/sysinternals/downloads/process-explorer](https://docs.microsoft.com/zh-cn/sysinternals/downloads/process-explorer)
如图所示
![](https://img.kancloud.cn/57/6c/576cbfe006930351739b7f4bbcb6b57d_746x571.png)
![](https://img.kancloud.cn/bb/f5/bbf5e214980daca25099b5fa5f699798_746x492.png)
发现最耗cpu的线程的TId为4240
这是十进制的数据,转成十六进制为1090。[十进制转十六进制在线工具](https://tool.oschina.net/hexconvert/)
<br/>
<br/>
#### 3.根据线程号查出对应的java线程,进行处理
执行命令, 根据上面的 PID 导出进程快照
~~~
jstack -l 4152 > F:/4152.stack
~~~
打开文件 F:/4152.stack,搜索上面转换的16 进制文字 1090,如下图所示
![](https://img.kancloud.cn/b2/85/b285f1179cc23bf64db3ed27c08d3dce_746x352.png)
根据文件就可以看出,我们的`TestFor.java`文件第12行一直在跑,至此定位到问题
<br/>
<br/>
### 二、Linux 版
#### 1.查消耗cpu最高的进程PID
执行命令
* 执行`top -c` ,显示进程运行信息列表。按下P,进程按照cpu使用率排序
如下图所示,PID为 1564 的进程耗费cpu最高
![](https://img.kancloud.cn/89/ab/89abd89786120ad7a150b86bf823afac_746x272.png)
<br/>
<br/>
#### 2.根据PID查出消耗cpu最高的线程号
执行命令
* `top -Hp 1564` ,显示一个进程的线程运行信息列表。按下P,进程按照cpu使用率排序
如下图所示,PID为1565的线程耗费cpu最高
![](https://img.kancloud.cn/9e/32/9e32d524faaa076259820e262a7bc234_746x462.png)
这是十进制的数据,转成十六进制为61d。[十进制转十六进制在线工具](https://tool.oschina.net/hexconvert/)
<br/>
<br/>
#### 3.根据线程号查出对应的java线程,进行处理
执行命令, 根据上面的 PID 导出进程快照
**ps:如果jstack 命令不能执行查看** [Linux 安装Java 开发调试工具包](https://www.kancloud.cn/fxlwj/bsdocument/2121062)
~~~
jstack -l 1564 > ./1564.stack
~~~
然后执行,grep命令,看线程`61d`做了什么
~~~
cat 1564.stack | grep '61d' -C 8
~~~
输出如下
![](https://img.kancloud.cn/93/c8/93c859651f05e4a7c1b031709d1aaa49_746x276.png)
根据文件就可以看出,我们的`TestFor.java`文件第12行一直在跑,至此定位到问题
- 版本管理
- BS版本管理
- BS数据库版本号升级
- 升级功能说明
- 平台升级1
- 平台升级2
- 第一章.平台规则
- Java版本配置注意事项
- 浏览界面自定义排序规则
- 弹出框选择数据自定义排序
- BS固定参数说明
- 常用界面地址格式
- 第二章.环境搭建
- JDK环境搭建
- 免安装版JDK的配置方法
- Java版本BS搭建
- Linux系统搭建BS程序
- Linux安装JDK
- 第三章.业务功能
- 基础业务
- 快速建模
- 左侧菜单栏目
- BS表单详解(弹出选择、多页签)
- 主细表、三层表配置
- 弹出框配置
- 映射下拉配置
- 数据检查条件配置
- 流程图配置方法1
- Java版本BS嵌入APP页面
- BS文档中心配置
- 第二版流程图配置方法
- 第一版流程图配置方法
- 第三版流程图配置方法
- 特殊业务
- BS树页面配置
- BS用户组权限配置
- 业务查询条件
- 查询条件配置
- BS 查询条件 "单选框" 和 "复选框" 配置
- 常用高级功能
- 自动补全配置
- BS字段输入值检查
- 字段汇总配置
- 文件上传配置
- Java版本发送邮件配置
- 设置网格内容对齐方式
- 查询页面状态使用图标表示配置
- Java版本发送邮件并携带附件
- BS嵌入BI图表
- 计算字段
- 自动计算配置
- 修改网格颜色
- 值改变时修改刷新网格汇总
- 按钮功能
- 按钮功能设置
- 按钮背景颜色设置
- 自定义查询界面不检查是否勾选
- Excel导入数据配置
- sql导入表数据配置
- Excel导出子表数据配置
- 弹窗自定义业务配置
- 自动赋值主表数据
- 获取浏览状态下细表选中字段
- 获取自定义查询界面勾选数据
- 带出三层表明细
- 批量审核功能配置
- 打印配置
- Java版本中使用CS打印
- CS打印使用BS文档中心图片
- IReport打印配置
- IReport打印设置主细表关联显示
- IReport打印记录打印次数
- IReport打印不能打印黑体、宋体等自定义字体解决方案
- Ureport报表打印
- 第四章.特殊功能说明
- API数据交互规范
- Kettle同步工具使用指南
- 通过Token登录BS
- .Net版本BS免登陆跳转并打开业务
- BS帮助文档使用说明
- BS接口程序搭建
- 存储过程手动分页配置
- BS 负载均衡部署
- quickBi嵌入BS系统
- BS部署SSL证书(https访问)
- BS演示搭建同一端口转发到不同机器
- BS嵌入APP界面动态渲染按钮并记录点击日志
- 第五章.常见问题
- BS流程图或业务打开报错
- 常见问题及解决方案
- .Net版本BS登录页报错
- BS表单引用app表单常见问题
- 修改BS的网页Logo
- BS上传文件后无法下载
- Java程序CPU占用100%后排查定位
- Linux 安装Java 开发调试工具包
- Linux开机自启动sh 脚本