我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家。
扫描二维码或搜索下图红色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基础面试笔试题相关推荐

  1. CPU占用过高问题的排查及解决

    CPU占用过高问题的排查及解决 排查步骤 1.使用top 定位到占用CPU高的进程PID      然后按shift+p按照CPU排序 2.查看Java进程里面的线程的占用情况 或者是再用ps -mp ...

  2. java cpu 占用率高_java实战CPU占用过高问题的排查及解决

    最近一段时间 某台服务器上的一个应用总是隔一段时间就自己挂掉 用top看了看 从重新部署应用开始没有多长时间CPU占用上升得很快 排查步骤 1.使用top 定位到占用CPU高的进程PID top 2. ...

  3. Java分布式锁看这篇就够了,java基础面试笔试题

    我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...

  4. Java 线上cpu占用过高分析

    转载于:https://blog.csdn.net/ch999999999999999999/article/details/113151519 感谢作者:ch999999999999999999 J ...

  5. 分享18道Java基础面试笔试题

    转载自 分享18道Java基础面试笔试题(面试实拍) 1.你最常上的两个技术站和最常使用的两个app分別进什么?主要解决你什么需求? 2.请简述http协议中get请求和post请求的区别. 3.请简 ...

  6. jvm cpu占用过高实例以及排查方法

    起因 在项目现场发现,程序运行的过程中,发现会时不时有cpu占用400%以上的情况,而通过界面很难定位到触发了哪里导致的,不能缩小分析范围. 收集数据 于是使用了以下几种方式采集数据: 1.对jar包 ...

  7. Java项目服务器cpu占用过高怎么办?

    借用汤师爷的一句话:"麻匪一定要缴---没有麻匪的日子才是好日子". 作为程序员,bug一定是要处理的,没有bug的日子才是好日子!你想想,你正吃着火锅唱着歌,突然收到生产环境异常 ...

  8. Java 基础面试题,java基础面试笔试题

    我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...

  9. java log4j基本配置及日志级别配置详解,java基础面试笔试题

    我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...

最新文章

  1. 吴恩达:AI未来将呈现四大发展趋势
  2. 树莓派开发6-配置树莓派的Linux内核
  3. 前方高能!金三银四Java高级工程师面试题整理
  4. IDEA Project Structure 配置说明
  5. 没用调用flush导致的数据保存丢失
  6. bilibili有电脑版吗_你体验过电脑版的《和平精英》吗?不用担心内存,也不用担心卡顿...
  7. DeeplabV3+ 在自己环境下跑出现的错误
  8. cmake-gui出错解决方法
  9. 其中一个页签慢_渭南提升一个大专学历的有效方法
  10. 普通索引 唯一索引 主键索引 候选索引
  11. 推荐一个强大的Go库-rk-boot,未来 Go领域的SpringBoot?
  12. python 无头浏览器_Python对Selenium调用浏览器进行封装包括启用无头浏览器,及对应的浏览器配置文件...
  13. VMware中linux硬盘空间不足的解决方法
  14. conda创建和使用python的虚拟环境
  15. sql server 2008 r2安装图解教程
  16. Nokia Widget 应用开发培训笔记
  17. 使用RAID 5虚拟磁盘时,dell的perc控制器H310的性能较差
  18. 尚学堂第二章作业题答案
  19. 自定义ImageView加载圆形图片
  20. React Antd4 CRA / Next.js / Vite 按需加载组件的 CSS / Less

热门文章

  1. Excel中根据单元格背景色求和
  2. 电平转换芯片_「厚积薄发」润石产品面面观之电平转换芯片 RS0104
  3. 2019幽门螺杆菌指南共识_《幽门螺杆菌感染基层诊疗指南(2019年)》发布! | 指南共识...
  4. (61)FPGA译码器实现(function)
  5. 不使用总线矩阵的CortexM3最小系统搭建(AHB外设有ITCM,DTCM,DEFAULT_SLAVE和AHB_APB桥,APB外设只有一个UART)附整个工程
  6. tems软件语音测试模板,测试软件使用-TEMS.ppt
  7. 嵌入式Linux系统编程学习之六make工程管理和Makefile
  8. 英业达软件测试工程师,「天津英业达软件测试工程师」面试招聘|工资待遇 - 看准网...
  9. 怎样设计访谈提纲_服务设计简史
  10. js java传参乱码_【技术贴】解决前台js传参中文乱码