如何處理Java應用在CPU高時的問題排查與解決
在Tomcat的應用下,出現Java進程佔用非常高的CPU,而內存卻佔用很少時,就需要考慮是否程序中有線程死鎖的情況出現,造成了CPU資源無法釋放;這時就要通過對CPU的線程及進程進行分析來找到問題的原因;
查找與定位問題通常分爲以下幾步:
1. 確定當前Java的進程ID:
ps -ef|grep java得到當前運行的java進程的PID;
如得到的ID爲10000
2.找到Java線程後,需要再定位實際在CPU中運行的線程情況,我們知識進程是表明一個程序,而線程是程序中實際在CPU中進行時間片的運算,因此我們需要定位到實際的線程情況:
方法一:ps -mp 10000 -o THREAD,tid,time | sort -rn
顯示結果如:
USER %CPU PRI SCNT WCHAN USER SYSTEM TID TIME
root 98.5 19 - - - - 10001 00:35:48
root 90.1 19 - - - - 10102 00:20:16
...
方法二:top -Hp 10000 -d 1 -n 3
顯示結果如:
top - 23:37:41 up 1:17, 4 users, load average: 0.09, 0.08, 0.12
Threads: 7 total, 0 running, 7 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.5 us, 0.0 sy, 0.0 ni, 99.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 3750588 total, 2459188 used, 1291400 free, 126660 buffers
KiB Swap: 0 total, 0 used, 0 free, 1361336 cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
12571 kevin 20 0 1167372 98148 31888 S 2.0 2.6 0:07.13 chrome
12575 kevin 20 0 1167372 98148 31888 S 0.0 2.6 0:00.60 Chrome_Chi+
12576 kevin 20 0 1167372 98148 31888 S 0.0 2.6 0:00.00 VC manager
12577 kevin 20 0 1167372 98148 31888 S 0.0 2.6 0:00.00 HTMLParser+
12578 kevin 20 0 1167372 98148 31888 S 0.0 2.6 0:00.00 Media
12591 kevin 20 0 1167372 98148 31888 S 0.0 2.6 0:00.00 FFmpegDemu+
12593 kevin 20 0 1167372 98148 31888 S 0.0 2.6 0:00.02 AudioOutpu+
它會列出此進程下所有的線程數,線程數即爲TID,裏面標注出了每個線程佔用CPU的資源數和佔用的時間,根據此結果我們發現這兩個線程是有問題的;
接下來我們要根據線程找到實際在CPU中運行的程序堆棧;
3.有了線程ID:10001,10002,我們需要首先將其轉換爲十六進制:
printf "%x\n" 10001
輸出:2711
printf "%x\n" 10101
輸出:2776
4.1 kill -3 10000 完了去日誌中找到輸出的信息,然後 拿着線程ID:10001,10101的十六進制去日誌中定位;
4.2 對於java程序還可以使用它的debug工具:jstack 10000|grep 2711 -A 30打印出包含此地址的線程堆棧,從而找到Java程序中哪些代碼一直在CPU中佔着資源不釋放;
打印出的堆棧信息如:
见附件图
相关推荐
oracleCPU占用率高时的问题定位.pdf
shell脚本自动监测系统cpu资源,异常彪高时,自动打印应用线程日志文件
这个是修复之后的,解决了已发现的BUG。服务器程序有时候不知道是什么原因导致CPU异常变高,每次变高都需要手工重启程序或服务,很麻烦,于是我就写了这个程序分享给网友朋友,希望能够帮到大家。使用说明,可自定义...
监控Java进程使用的CPU,当占用率过高时,自动收集Top信息和Thread Stack。启动、停止、查询、导出飞行记录。使用方法将工具上传到Linux服务器的任意目录,并进行解压。注意:须确保Java进程用户有权限访问此工具...
本文主要通过分析云系统遭遇的java进程内存溢出的问题,介绍java进程占用系统内存高时的排查方案及建议的解决方案,同时延伸拓展java进程占用系统内存高的原因以及对于linux操作系统的内存管理和优化方案。...
由ssh无法登陆排查原因,总结的io以及cpu负载过高时的排查命令
CPU降温软件 在夏日温度过高时!笔记本温度过高会影响笔记本的寿命 此软件能帮您解决此问题!
NiceHashMiner, NiceHash易于使用 cpu& GPU Miner NiceHash挖掘器简介有什么好处? 特性要求如何运行 get&?... 如何仅在利润率足够高时运行NiceHash挖掘器? 附加选项故障排除如何报告 Bug 和问题? 引用 简介Nic
用于DESUtil的加密//密码,长度要是8的倍数 注意此处为简单密码 简单应用 要求不高时可用此密码 /*DES是一种对称加密算法,所谓对称加密算法即:加密和解密使用相同密钥的算法。DES加密算法出自IBM的研究, 后来被...
:repeat_button: 一个简单的bash脚本,可在CPU负载很高时自动启用CF UAM •••推介会CF-Auto-UAM是一个简单的bash脚本,带有一个自动安装程序,它将为您安装所有内容。 CF-Auto-UAM安装两个cronjob: 一项cronjob每...
模拟退火算法解决tsp问题,内含画图代码,tsp标准数据集拟退火算法(Simulated Annealing,简称SA)的思想最早是由Metropolis等提出的。其出发点是基于物理中固体物质的退火过程与一般的组合优化问题之间的相似性。...
SolveFlashingAndRedraw框架是MFC解决窗口保存及重绘闪烁问题的一种比较好的方案(Win32解决方法类似)。 版本历史: v1.0.1 20091126 第一版本 v1.0.2 20091212 第二版本 1. 修改了部分变量的名字使其更符合其...
没有queue缓冲,一直new thread执行,当cpu负载高时加上更多线程上下文切换损耗,性能会急速下降。 // Executors.newFixedThreadPool(16); 执行的thread数量固定,但当thread 等待时间(IO时间)过长时会造成吞吐量...
SolveFlashingAndRedraw框架是MFC解决窗口保存及重绘闪烁问题的一种比较好的方案(Win32解决方法类似)。 版本历史: v1.0.1 20091126 第一版本 v1.0.2 20091212 第二版本 1. 修改了部分变量的名字使其更符合其...
SolveFlashingAndRedraw框架是MFC解决窗口保存及重绘闪烁问题的一种比较好的方案(Win32解决方法类似)。 版本历史: v1.0.1 20091126 第一版本 v1.0.2 20091212 第二版本 1. 修改了部分变量的名字使其更符合其...
针对原料煤中末煤含量大、矸石泥化程度高跳汰分选困难情况,从风水制度、风阀周期、床层设定、给料排料等工作制度上进行分析调整,从而提高分选效果、分选精度、洗选效率。
S7-1200PLC高速计数器在脉冲频率低时正常,为什么频率高时显示为0,不再计数了?
主要用来cpu监测,占用系统很少的资源,对于夏天天热或冬天室内温度过高时系统状况很好!