最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java實戰(zhàn)CPU占用過高問題的排查及解決

 更新時間:2018年08月10日 08:45:27   作者:江湖前輩黃藥師  
這篇文章給大家分享了java實戰(zhàn)CPU占用過高問題的排查及解決方法,有需要的朋友們可以學(xué)習(xí)下。

最近一段時間 某臺服務(wù)器上的一個應(yīng)用總是隔一段時間就自己掛掉 用top看了看 從重新部署應(yīng)用開始沒有多長時間CPU占用上升得很快

排查步驟

1.使用top 定位到占用CPU高的進程PID

top

2.通過ps aux | grep PID命令

獲取線程信息,并找到占用CPU高的線程

ps -mp pid -o THREAD,tid,time | sort -rn

3.將需要的線程ID轉(zhuǎn)換為16進制格式

printf "%x\n" tid

4.打印線程的堆棧信息 到了這一步具體看堆棧的日志來定位問題了

jstack pid |grep tid -A 30

top 可以看出PID 733進程 的占用CPU 172%

查找進程733下的線程 可以看到TID 線程775占用了96%且持有了很長時間 其實到這一步基本上能猜測到應(yīng)該是 肯定是那段代碼發(fā)生了死循環(huán)

ps -mp 733 -o THREAD,tid,time | sort -rn

線程ID轉(zhuǎn)換為16進制格式

printf "%x\n" 775

查看java 的堆棧信息

jstack 733 |grep 307 -A 30

顯然是 SmsQueueServiceImpl 中的produceMissSms 和 consumeMissSms 方法有問題

一下為精簡的部分代碼

/** * Created by dongxc on 2015/7/7. 通知消息隊列 */
@Service("smsQueueService")
public class SmsQueueServiceImpl {
 // 生產(chǎn)異常隊列方法
 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("通知消息異常隊列生產(chǎn)消息返回失敗!"+smsLogDo.getId()); } }catch(Exception e){
   * logger.error("通知消息異常隊列生產(chǎn)消息失??!", 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;
  }
 }
}

從很有年代感的垃圾代碼來看 這兩個方法并沒有什么問題 繼續(xù)往調(diào)用這兩個方法的上層排查

/**
 * Created by dongxc on 2015/7/7.
 * 消息通知監(jiān)控線程
 */
@Service("smsMonitorComsumer")
public class SmsMonitorComsumerImpl {

 @Autowired
 private SmsQueueServiceImpl smsQueueService;
 
 //取隊列里的任務(wù)消費
 @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("發(fā)送站內(nèi)信息短信時線程執(zhí)行失敗2!", e);
    }
   }
  }



 }
}

很顯然 這里有一個while(true) 基本定位到問題了 while里面完全是沒有用的代碼

繼續(xù)往上層看誰來調(diào)用

/**
 * Created by dongxc on 2015/7/7.
 * 通知消息隊列
 */
@Service("smsLogRunThread")
public class SmsLogRunThreadImpl {
 public int flag;
 @Autowired
 private SmsLogConsumerImpl smsLogConsumer;
 @Autowired
 private SmsMonitorComsumerImpl smsMonitorComsumer;

 @PostConstruct
 public 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();
  }

  
 }
}

在應(yīng)用一啟動的時候 spring初始化的就會執(zhí)行這一段處理丟失消息的代碼 然后這段死循環(huán)代碼 沒有任何作用

解決方法 即 注釋掉whlie(true)這一段代碼

案例一下,其實之前也遇到過CPU占用很高的問題, 但是那次是 頻繁的GC導(dǎo)致的

其實排查問題 的過程中也是在不斷的學(xué)習(xí)的過程

相關(guān)文章

  • Java常用API類之Math System tostring用法詳解

    Java常用API類之Math System tostring用法詳解

    System類代表系統(tǒng),系統(tǒng)級的很多屬性和控制方法都放置在該類的內(nèi)部。該類位于java.lang包,Java 的 Math 包含了用于執(zhí)行基本數(shù)學(xué)運算的屬性和方法,如初等指數(shù)、對數(shù)、平方根和三角函數(shù),toString() 方法用于返回以一個字符串表示的 Number 對象值
    2021-10-10
  • java實現(xiàn)ATM取款項目

    java實現(xiàn)ATM取款項目

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)ATM取款項目的實現(xiàn)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • java調(diào)用微信現(xiàn)金紅包接口的心得與體會總結(jié)

    java調(diào)用微信現(xiàn)金紅包接口的心得與體會總結(jié)

    這篇文章主要介紹了java調(diào)用微信現(xiàn)金紅包接口的心得與體會總結(jié),有需要的朋友可以了解一下。
    2016-11-11
  • Java開發(fā)實現(xiàn)猜拳游戲

    Java開發(fā)實現(xiàn)猜拳游戲

    這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)猜拳游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • mybatis中的mapper.xml使用循環(huán)語句

    mybatis中的mapper.xml使用循環(huán)語句

    這篇文章主要介紹了mybatis中的mapper.xml使用循環(huán)語句,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • java中的序列化解析

    java中的序列化解析

    這篇文章主要介紹了java中的序列化解析,為了將對象進行網(wǎng)絡(luò)傳輸或者是持久化,我們需要將對象的狀態(tài)信息轉(zhuǎn)換為可以存儲或者傳輸?shù)男问?這個轉(zhuǎn)換的過程就叫序列化,需要的朋友可以參考下
    2023-09-09
  • SpringCloud中的Consul詳解

    SpringCloud中的Consul詳解

    這篇文章主要介紹了SpringCloud中的Consul知識,本文使用的是docker-compose方式管理consul服務(wù),直接啟動即可,需要的朋友可以參考下
    2022-03-03
  • Java中的HashMap和Hashtable區(qū)別解析

    Java中的HashMap和Hashtable區(qū)別解析

    這篇文章主要介紹了Java中的HashMap和Hashtable區(qū)別解析,HashMap和Hashtable都實現(xiàn)了Map接口,但決定用哪一個之前先要弄清楚它們之間的區(qū)別,主要的區(qū)別有線程安全性、同步和速度,需要的朋友可以參考下
    2023-11-11
  • MyBatis中criteria的or(或查詢)語法說明

    MyBatis中criteria的or(或查詢)語法說明

    這篇文章主要介紹了MyBatis中criteria的or(或查詢)語法說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • MyBatis使用接口映射的方法步驟

    MyBatis使用接口映射的方法步驟

    映射器是MyBatis中最核心的組件之一,本文主要介紹了MyBatis使用接口映射的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07

最新評論

海兴县| 东明县| 象州县| 拜泉县| 平顺县| 新平| 敖汉旗| 平顺县| 金昌市| 永宁县| 株洲市| 辉南县| 象州县| 邢台县| 临泽县| 富源县| 当阳市| 芷江| 射阳县| 绥江县| 双鸭山市| 隆子县| 满城县| 宾阳县| 丁青县| 乐东| 呼图壁县| 宝坻区| 关岭| 甘南县| 苏尼特右旗| 白朗县| 新津县| 龙门县| 丹巴县| 旺苍县| 常德市| 获嘉县| 镶黄旗| 绥芬河市| 邮箱|