亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

線上Java程序占用CPU過高解決方案

 更新時(shí)間:2020年11月17日 09:10:07   作者:風(fēng)的姿態(tài)  
這篇文章主要介紹了線上Java程序占用CPU過高解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

這個(gè)問題可以說是 Java 面試的高頻面試題了,有很多面試官都喜歡問這個(gè)問題,問題可能是下面這樣的。

線上一臺(tái)服務(wù)器 CPU 使用率100% 了,如果你碰到這樣的情況,如何排查并找到問題原因?

這就是一個(gè)套路題,所謂套路題就是有標(biāo)準(zhǔn)的套路解法的,掌握了套路,不僅能解決面試官,還能解決問題。不然真的就掉進(jìn)套路里了。

當(dāng)我們真碰到這個(gè)問題的時(shí)候應(yīng)該怎么排查呢?

模擬一個(gè)高 CPU 場(chǎng)景

先用一段程序創(chuàng)建幾個(gè)線程,將其中一個(gè)線程設(shè)置成高 CPU 使用率的。

public static void main(String[] args) {
 for (int i = 0; i < 10; i++) {
  Thread thread = new Thread(() -> {
   System.out.println(Thread.currentThread().getName());
   try {
    Thread.sleep(30 * 60 * 1000);
   }catch (Exception e){
    e.printStackTrace();
   }
  });
  thread.setName("thread-" + i);
  thread.start();
 }

 Thread highCpuThread = new Thread(() -> {
  int i = 0;
  while (true) {
   i++;
  }
 });
 highCpuThread.setName("HighCpu");
 highCpuThread.start();
}

運(yùn)行這段程序后,前面 10 個(gè)線程都處于休眠狀態(tài),只有最后一個(gè)線程會(huì)持續(xù)的占用 CPU 。

運(yùn)行這段程序,然后就可以開始一些列的操作來發(fā)現(xiàn)問題原因了。

排查步驟第一步,使用 top 找到占用 CPU 最高的 Java 進(jìn)程

在真實(shí)環(huán)境中,首先要確認(rèn)是不是 Java 程序造成的,如果有系統(tǒng)監(jiān)控工具,可能會(huì)直接在預(yù)警信息里告訴你是有哪個(gè)進(jìn)程造成的,但也有可能不知道,需要我們手動(dòng)排查。

如果是在面試場(chǎng)景中,這個(gè)問題可能不需要確認(rèn),畢竟 Java 面試,面試官可能直接就告訴你是 Java 占用的 CPU 過高。

這一步也非常簡(jiǎn)單,就是一個(gè) top命令而已,基本上所有同學(xué)都用過這個(gè)命令吧。

使用 top命令發(fā)現(xiàn)占用 CPU 99.7% 的線程是 Java 進(jìn)程,進(jìn)程 PID 為 13731。

第二步,用 top -Hp 命令查看占用 CPU 最高的線程

上一步用 top命令找到了那個(gè) Java 進(jìn)程。那一個(gè)進(jìn)程中有那么多線程,不可能所有線程都一直占著 CPU 不放,這一步要做的就是揪出這個(gè)罪魁禍?zhǔn)祝?dāng)然有可能不止一個(gè)。

執(zhí)行top -Hp pid命令,pid 就是前面的 Java 進(jìn)程,我這個(gè)例子中就是 13731 ,完整命令為:

top -Hp 13731,執(zhí)行之后的效果如下

可以看到占用 CPU 最高的那個(gè)線程 PID 為 13756。

然后將 13756轉(zhuǎn)換為 16 進(jìn)制的,后面會(huì)用到,可以用在線進(jìn)制轉(zhuǎn)換的網(wǎng)站直接轉(zhuǎn)換,轉(zhuǎn)換結(jié)果為 0x35bc

第三步,保存線程棧信息

當(dāng)前 Java 程序的所有線程信息都可以通過 jstack命令查看,我們用jstack命令將第一步找到的 Java 進(jìn)程的線程棧保存下來。

jstack 13731 > thread_stack.log

第四步,在線程棧中查找最貴禍?zhǔn)椎木€程

第二步已經(jīng)找到了這個(gè)罪魁禍?zhǔn)椎木€程 PID,并把它轉(zhuǎn)換成了 16 進(jìn)制的,第三步保存下來的線程棧中有所有線程的 PID 16 進(jìn)制信息,我們?cè)诰€程棧中查找這個(gè)16進(jìn)制的線程 id (0x35bc)。

怎么樣,現(xiàn)在一目了然了,線程名稱、線程狀態(tài)、以及哪行代碼消耗了最多的 CPU 都很清楚了。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring AOP與代理類的執(zhí)行順序級(jí)別淺析

    Spring AOP與代理類的執(zhí)行順序級(jí)別淺析

    這篇文章主要介紹了Spring AOP與代理類的執(zhí)行順序級(jí)別,關(guān)于 Spring AOP和Aspectj的關(guān)系,兩個(gè)都實(shí)現(xiàn)了切面編程,Spring AOP更多地是為了Spring框架本身服務(wù)的,而Aspectj具有更強(qiáng)大、更完善的切面功能
    2023-03-03
  • java實(shí)現(xiàn)單鏈表之逆序

    java實(shí)現(xiàn)單鏈表之逆序

    這篇文章主要介紹了應(yīng)用java語(yǔ)言實(shí)現(xiàn)單鏈表逆序,,需要的朋友可以參考下
    2015-07-07
  • SpringCloud重試機(jī)制配置詳解

    SpringCloud重試機(jī)制配置詳解

    本篇文章主要介紹了SpringCloud重試機(jī)制配置詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-04-04
  • Mybatis CachingExecutor二級(jí)緩存使用示例詳解

    Mybatis CachingExecutor二級(jí)緩存使用示例詳解

    這篇文章主要介紹了?Mybatis的CachingExecutor與二級(jí)緩存使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Springboot整合SpringSecurity的完整案例詳解

    Springboot整合SpringSecurity的完整案例詳解

    Spring Security是基于Spring生態(tài)圈的,用于提供安全訪問控制解決方案的框架,Spring Security登錄認(rèn)證主要涉及兩個(gè)重要的接口 UserDetailService和UserDetails接口,本文對(duì)Springboot整合SpringSecurity過程給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2024-01-01
  • 玩轉(zhuǎn)spring boot MVC應(yīng)用(2)

    玩轉(zhuǎn)spring boot MVC應(yīng)用(2)

    玩轉(zhuǎn)spring boot,如何快速搭建一個(gè)MCV程序?這篇文章為大家詳細(xì)主要介紹了一個(gè)MCV程序的快速搭建過程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • 如何使用pipeline和jacoco獲取自動(dòng)化測(cè)試代碼覆蓋率

    如何使用pipeline和jacoco獲取自動(dòng)化測(cè)試代碼覆蓋率

    這篇文章主要介紹了如何使用pipeline和jacoco獲取自動(dòng)化測(cè)試代碼覆蓋率,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Spring用代碼來讀取properties文件實(shí)例解析

    Spring用代碼來讀取properties文件實(shí)例解析

    這篇文章主要介紹了Spring用代碼來讀取properties文件實(shí)例解析,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • java中BigDecimal的介紹及使用教程BigDecimal格式化及BigDecimal常見問題

    java中BigDecimal的介紹及使用教程BigDecimal格式化及BigDecimal常見問題

    BigDecimal是Java在java.math包中提供的線程安全的API類,用來對(duì)超過16位有效位的數(shù)進(jìn)行精確的運(yùn)算,這篇文章主要介紹了java中BigDecimal的介紹及使用,BigDecimal格式化,BigDecimal常見問題,需要的朋友可以參考下
    2023-08-08
  • SpringBoot自定義全局異常處理器的問題總結(jié)

    SpringBoot自定義全局異常處理器的問題總結(jié)

    Springboot框架提供兩個(gè)注解幫助我們十分方便實(shí)現(xiàn)全局異常處理器以及自定義異常,處理器會(huì)優(yōu)先處理更具體的異常類型,如果沒有找到匹配的處理器,那么它會(huì)尋找處理更一般異常類型的處理器,本文介紹SpringBoot自定義全局異常處理器的問題,一起看看吧
    2024-01-01

最新評(píng)論