java 一次CPU占用过高问题的排查及解决,java基础面试笔试题
我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家。
扫描二维码或搜索下图红色VX号,加VX好友,拉你进【程序员面试学习交流群】免费领取。也欢迎各位一起在群里探讨技术。
推荐文章:Java 面试知识点解析;Mysql优化技巧(数据库设计、命名规范、索引优化
最近一段时间 某台服务器上的一个应用总是隔一段时间就自己挂掉 用top看了看 从重新部署应用开始没有多长时间CPU占用上升得很快
排查步骤
1.使用top 定位到占用CPU高的进程PID
top
2.通过ps aux | grep PID命令
获取线程信息,并找到占用CPU高的线程
ps -mp pid -o THREAD,tid,time | sort -rn
3.将需要的线程ID转换为16进制格式
printf "%x " tid
4.打印线程的堆栈信息 到了这一步具体看堆栈的日志来定位问题了
jstack pid |grep tid -A 30
---------------------------------------------------------------------------- 华丽的分割线 ------------------------------------------------------------------------------------------------------------------
top 可以看出PID 733进程 的占用CPU 172%
查找进程733下的线程 可以看到TID 线程775占用了96%且持有了很长时间 其实到这一步基本上能猜测到应该是 肯定是那段代码发生了死循环
ps -mp 733 -o THREAD,tid,time | sort -rn
线程ID转换为16进制格式
printf "%x " 775
查看java 的堆栈信息
jstack 733 |grep 307 -A 30
显然是 SmsQueueServiceImpl 中的produceMissSms 和 consumeMissSms 方法有问题
一下为精简的部分代码
/*** Created by dongxc on 2015/7/7. 通知消息队列*/
@Service("smsQueueService")public class SmsQueueServiceImpl {// 生产异常队列方法public void produceMissSms(SmsLogDo smsLogDo) {/* * try{ String key = EnumRedisPrefix.SMS_QUEUE_MISS_DEAL.getValue(); boolean result = redisService.lpush(key,* smsLogDo, 0); if(result==false){ logger.error("通知消息异常队列生产消息返回失败!"+smsLogDo.getId()); } }catch(Exception e){* logger.error("通知消息异常队列生产消息失败!", e); }*/ }// 消费异常队列方法public SmsLogDo consumeMissSms() {try {String destKey = EnumRedisPrefix.SMS_QUEUE_MISS_DEAL.getValue();SmsLogDo smsLogDo = new SmsLogDo();Object obj = null;if (obj == null) {return null;} else {smsLogDo = (SmsLogDo) obj;}return smsLogDo;} catch (Exception e) {logger.error("通知消息队列消费方法失败!", e);return null;}}}
从很有年代感的垃圾代码来看 这两个方法并没有什么问题 继续往调用这两个方法的上层排查
/** * Created by dongxc on 2015/7/7.* 消息通知监控线程*/@Service("smsMonitorComsumer")public class SmsMonitorComsumerImpl {@Autowiredprivate SmsQueueServiceImpl smsQueueService;//取队列里的任务消费@Transactional(propagation= Propagation.NOT_SUPPORTED)public void run() {while (true) {try {SmsLogDo smsLogDo = smsQueueService.consumeMissSms();Boolean result = false;if(smsLogDo!=null){long diff = (new Date()).getTime() - smsLogDo.getSendtime().getTime() ;long min = diff%(1000*24*60*60)%(1000*60*60)/(1000*60);//计算差多少分钟if(min>5){result = true;}}if(result){smsQueueService.produceSms(smsLogDo);}else{smsQueueService.produceMissSms(smsLogDo);}} catch (Exception ex) {try{Thread.sleep(3000);}catch(Exception e){//logger.error("发送站内信息短信时线程执行失败2!", e); }}}}}
很显然 这里有一个while(true) 无数个草泥马策马奔腾 ps:垃圾代码看多了, 我已经不愤怒了.
基本定位到问题了 while里面完全是没有用的代码
继续往上层看谁来调用
/** * Created by dongxc on 2015/7/7.* 通知消息队列*/@Service("smsLogRunThread")public class SmsLogRunThreadImpl {public int flag;@Autowiredprivate SmsLogConsumerImpl smsLogConsumer;@Autowiredprivate SmsMonitorComsumerImpl smsMonitorComsumer;@PostConstructpublic void init() {if(ip!=""&&host!=""&&ip.equals(host)){Thread thread = new Thread(){public void run() {smsLogConsumer.run();}};thread.start();Thread thread1 = new Thread(){public void run() {smsMonitorComsumer.run();}};thread1.start();}}}
在应用一启动的时候 spring初始化的就会执行这一段处理丢失消息的代码 然后这段死循环代码 没有任何作用
解决方法 即 注释掉whlie(true)这一段代码
重新部署后 cpu占用就很正常了
案例一下,其实之前也遇到过CPU占用很高的问题, 但是那次是 频繁的GC导致的
其实排查问题 的过程中也是在不断的学习的过程 ! 先打个鸡血,我要继续搬砖了
转载:https://www.cnblogs.com/xxj0316/p/9448987.html
推荐内容:
java常见面试题
java 和 Android Base64加密
Java面试通关要点
面试必问!Java 多线程中两个线程交替执行,一个输出偶数,一个输出奇数
Java面试集合(一)
JAVA开发工程师面试(1)
漫谈Java IO之基础篇
微信小程序登录JAVA后台
Java 面试知识点解析(七)——Web篇
Java工程师的生活、读书、技术栈
java 一次CPU占用过高问题的排查及解决,java基础面试笔试题相关推荐
- CPU占用过高问题的排查及解决
CPU占用过高问题的排查及解决 排查步骤 1.使用top 定位到占用CPU高的进程PID 然后按shift+p按照CPU排序 2.查看Java进程里面的线程的占用情况 或者是再用ps -mp ...
- java cpu 占用率高_java实战CPU占用过高问题的排查及解决
最近一段时间 某台服务器上的一个应用总是隔一段时间就自己挂掉 用top看了看 从重新部署应用开始没有多长时间CPU占用上升得很快 排查步骤 1.使用top 定位到占用CPU高的进程PID top 2. ...
- Java分布式锁看这篇就够了,java基础面试笔试题
我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...
- Java 线上cpu占用过高分析
转载于:https://blog.csdn.net/ch999999999999999999/article/details/113151519 感谢作者:ch999999999999999999 J ...
- 分享18道Java基础面试笔试题
转载自 分享18道Java基础面试笔试题(面试实拍) 1.你最常上的两个技术站和最常使用的两个app分別进什么?主要解决你什么需求? 2.请简述http协议中get请求和post请求的区别. 3.请简 ...
- jvm cpu占用过高实例以及排查方法
起因 在项目现场发现,程序运行的过程中,发现会时不时有cpu占用400%以上的情况,而通过界面很难定位到触发了哪里导致的,不能缩小分析范围. 收集数据 于是使用了以下几种方式采集数据: 1.对jar包 ...
- Java项目服务器cpu占用过高怎么办?
借用汤师爷的一句话:"麻匪一定要缴---没有麻匪的日子才是好日子". 作为程序员,bug一定是要处理的,没有bug的日子才是好日子!你想想,你正吃着火锅唱着歌,突然收到生产环境异常 ...
- Java 基础面试题,java基础面试笔试题
我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...
- java log4j基本配置及日志级别配置详解,java基础面试笔试题
我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...
最新文章
- 吴恩达:AI未来将呈现四大发展趋势
- 树莓派开发6-配置树莓派的Linux内核
- 前方高能!金三银四Java高级工程师面试题整理
- IDEA Project Structure 配置说明
- 没用调用flush导致的数据保存丢失
- bilibili有电脑版吗_你体验过电脑版的《和平精英》吗?不用担心内存,也不用担心卡顿...
- DeeplabV3+ 在自己环境下跑出现的错误
- cmake-gui出错解决方法
- 其中一个页签慢_渭南提升一个大专学历的有效方法
- 普通索引 唯一索引 主键索引 候选索引
- 推荐一个强大的Go库-rk-boot,未来 Go领域的SpringBoot?
- python 无头浏览器_Python对Selenium调用浏览器进行封装包括启用无头浏览器,及对应的浏览器配置文件...
- VMware中linux硬盘空间不足的解决方法
- conda创建和使用python的虚拟环境
- sql server 2008 r2安装图解教程
- Nokia Widget 应用开发培训笔记
- 使用RAID 5虚拟磁盘时,dell的perc控制器H310的性能较差
- 尚学堂第二章作业题答案
- 自定义ImageView加载圆形图片
- React Antd4 CRA / Next.js / Vite 按需加载组件的 CSS / Less
热门文章
- Excel中根据单元格背景色求和
- 电平转换芯片_「厚积薄发」润石产品面面观之电平转换芯片 RS0104
- 2019幽门螺杆菌指南共识_《幽门螺杆菌感染基层诊疗指南(2019年)》发布! | 指南共识...
- (61)FPGA译码器实现(function)
- 不使用总线矩阵的CortexM3最小系统搭建(AHB外设有ITCM,DTCM,DEFAULT_SLAVE和AHB_APB桥,APB外设只有一个UART)附整个工程
- tems软件语音测试模板,测试软件使用-TEMS.ppt
- 嵌入式Linux系统编程学习之六make工程管理和Makefile
- 英业达软件测试工程师,「天津英业达软件测试工程师」面试招聘|工资待遇 - 看准网...
- 怎样设计访谈提纲_服务设计简史
- js java传参乱码_【技术贴】解决前台js传参中文乱码