timed_waiting線程是否占用cpu_程序CPU占用率飆升,如何定位線程的堆棧信息?超詳細,值得收藏看不懂還有配套視頻 第319篇...

關歷史文章(閱讀本文前,您可能需要先看下之前的系列?)

國內最全的Spring?Boot系列之三

2020上半年發文匯總「值得收藏」

GraphQL的探索之路?–?SpringBoot集成GraphQL小栗子篇二?-?第315篇

GraphQL的探索之路?–?SpringBoot集成GraphQL之Query篇三?-?第316篇

GraphQL的探索之路?–?SpringBoot集成GraphQL之Mutation篇四?-?第317篇

RocketMQ安裝Linux/Mac/Window - 第318篇

需求緣起

在群里有這么一段對話:

愿得一人心:服務器cpu load偏高,無從下手,哪位大佬能提供點兒幫助

不老神話:top 查看偏高的進程

老鼠愛上貓:百度谷歌啊? 查問題也是程序員必備技能之一

莫欺少年窮:要相信你肯定不是第一個遇到這個問題的

愿得一人心:查了,不頂用。

?????? 問問題真的把問題說清楚,不然解答的人也是一臉懵逼,很多人都是愿意解答問題的,但是問問題的人問的模棱兩可,導致沒有人敢解答。

正文開始? ?? ?

悟纖:師傅,師傅,緊急求助。

52322987efd58845fe606b7911d3f12a.gif

師傅:徒兒,何事如此之著急?

悟纖:我發現我寫的代碼導致CPU持續為99%,但是項目路這么大,我也不知道是哪塊代碼導致的。

師傅:徒兒,那你得看看是哪個線程里的邏輯導致了CPU飆高。

悟纖:那我們怎么找到這個線程在運行的堆棧信息吶?

師傅:jstack呀,你難道沒有聽過嘛?

悟纖:知道到知道這個指令,但是查看了些資料,都是說的不清楚,看完我也是一塌糊涂吶。

師傅:看來得為師給你好好講講了。

悟纖:還是喜歡師傅的講解方式,簡單、詳細、一語道破天機

37639fde8052d687ea35d3d5760ecd61.gif

一、排查步驟

師傅:要找回線程的堆棧信息,主要是利用java給我們提供的調優工具jstack,我們看下具體的一個步驟:

(1)使用命令top -p ,顯示你的java進程的cpu情況,pid是你的java進程號,比如14203。(使用jps可以獲取到java的進程id 或者top直接查看)

(2)按H,獲取每個線程的CPU情況。(shirt+H)

(3)找到內存和cpu占用最高的線程tid,比如14204。

(4)轉為十六進制得到 377C ,此為線程id的十六進制表示。

(5)執行 jstack |grep -A 10 ,得到線程堆棧信息中1371這個線程所在行的后面10行。(注意:如果十六進制由字母的要小寫)

# Jstack 14203 |? grep -A 10 377c

(6)查看對應的堆棧信息找出可能存在問題的代碼。

師傅:看起來是不是很復雜,描述的羅里吧嗦的。

悟纖:看著就暈頭轉向的。

師傅:一句話概述。

一句話:通過top找到線程id,通過jstack找到線程的堆棧信息。

二、小試牛刀:Linux環境

2.1 準備工作

?????? 我們編寫一個小代碼EndlessLoopTest用于模擬導致cpu過高(源碼在最后提供),編譯成class文件,將我們的class文件放到Linux上。

?????? 注意:存放的需要根據包名建立目錄結構,否則無法運行此class文件。

比如包名是com.kfit.jvm那么就需要創建一個目錄結構com/kfit/jvm,然后把EndlessLoopTest.class放到這里面。

執行class:

java com.kfit.jvm.EndlessLoopTest

2.2 排查實戰

2.2.1 使用top找到cpu飆高的java進程ID

?????? 首先我們需要找到java進程ID,使用top指令:

#top

a4b33d97891c1c6b2b9965e402ac8163.png

?????? 我們一看就看到了pid為14203的java的CPU使用率是99.7%并且持續飆高,那么這個肯定是代碼寫的有問題了。

2.2.2 使用top -p 顯示進程情況

?????? 我們使用如下命名查看java進程的情況:

#top -p 14203

1e7a4e64f69d2fa878547b56ead75ea1.png

?????? 通過-p的方法就是只顯示了指定進程的信息。

2.2.3 按H查看線程的CPU情況

?????? 在上面的界面中使用shirt+H進行查看各個線程的CPU情況:

ae41e5f10166006eec5f4fed5dc7d2f2.png

?????? 注意這里的PID實際對應的是線程的十進制的tid,通過上面我們可以看到CPU使用很高的線程ID是14204。

2.2.4 線程十進制轉換為十六進制

?????? 我們將獲取到的線程十進制的轉換為十六進制:

14204(十進制) = 377C(十六進制)

?????? 怎么轉你不知道嘛?

方式一:找個轉換網站

https://tool.oschina.net/hexconvert/

https://tool.lu/hexconvert/(這個強大,可以一下子轉換出來好幾個進制的)

方式二:Linux/Mac的printf

?????? 使用Linux/Mac的printf即可:

printf %x 14204? && echo

7c7c0560c7ddf8b3e01f9d69767d7696.png

方式三:Linux/Mac的echo

?????? Echo也是很強大的:

echo 'ibase=10;obase=16;14204'|bc

方式四:python的hex

?????? 利用python的轉換hex將十進制轉換為十六進制:

d193cab96c757509ba769a9d8f0b8fc1.png

悟纖:師傅,你這是要飄了,要跑題了

556ec093fb812add815c33837e368d9e.png

師傅:哈哈,師傅這是已經超神了。

34b88e108349fb31c3336dc472ba060c.gif

2.2.5 執行jstack得到線程的堆棧信息

執行 jstack | grep -A 10 ,得到線程堆棧信息:

#jstack 14203 |? grep -A 10 377c

注意:小c、小c、小c,重要的事情說3遍。

6b41c214a4dcb195d27f5b17fcef6636.png

2.2.6查看對應的堆棧信息問題排查

?????? 我上面的堆棧信息可以看出出現問題的類是EndlessLoopTest.java,代碼行號是13:

a0d6bdc5590264c0fd4583778435fb13.png

源碼:

package com.kfit.jvm;import java.net.Socket;/** * 死循環測試 */public class EndlessLoopTest {    public void test(){        int random = (int) (java.lang.Math.random() * 1000);        while (random < 100) {            random = random * 10;        }        System.out.println(random);    }    public static void main(String[] args) {        EndlessLoopTest test = new EndlessLoopTest();        for(int i=0;i<5000;i++){            test.test();        }    }}

?????? 我們分析這個while循環,看著挺正常的,但是如果當random為0的時候,不就是陷入死循環了嗎。

悟纖小結

悟纖:師傅,你真是我的偶像,講解的如此之詳細,我要是再不懂,看來只能退出編程界了。

師傅:徒兒,言重了。雖然為師已經介紹的很詳細了,但是難免在實際使用的時候會踩到一些坑。

悟纖:那為了避免大家采坑,我和大家總結下。

核心就是兩大步驟:

(1)通過top找到線程id。

通過Linux系統的top命名找到cpu飆高的進程id;通過top -p 找到該進程id的cpu信息;然后配合shirt+H命名,就可以找到CPU線程高的線程ID:通過工具類將十進制的線程id轉換為十六進制的。

(2)通過jstack找到線程的堆棧信息。

?????? 通過jstack | grep -A 10 就可以找到線程的堆棧信息。

通過top找到線程id,通過jstack找到線程的堆棧信息。

我就是我,是顏色不一樣的煙火。
我就是我,是與眾不同的小蘋果。

à悟空學院:https://t.cn/Rg3fKJD

學院中有Spring?Boot相關的課程!點擊「閱讀原文」進行查看!

SpringBoot視頻:http://t.cn/A6ZagYTi

Spring?Cloud視頻:http://t.cn/A6ZagxSR

SpringBoot?Shiro視頻:http://t.cn/A6Zag7IV

SpringBoot交流平臺:https://t.cn/R3QDhU0

SpringData和JPA視頻:http://t.cn/A6Zad1OH

SpringSecurity5.0視頻:http://t.cn/A6ZadMBe

Sharding-JDBC分庫分表實戰:

http://t.cn/A6ZarrqS

分布式事務解決方案「手寫代碼」:

http://t.cn/A6ZaBnIr

深入理解JVM內存模型/調優實戰:

http://t.cn/A6wWMVqG

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/273170.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/273170.shtml
英文地址,請注明出處:http://en.pswp.cn/news/273170.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

圖片的縮放(放大縮小)

package com.school.util;import java.awt.Graphics; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException;import javax.imageio.ImageIO; /*** * <b>類名稱&#xff1a;圖片處理工具類</b>ImageUtils…

sql多層嵌套別名無效_SQL之復雜查詢

前文學了匯總分析&#xff0c;學了常見的匯總函數&#xff0c;會分組并且掌握了對分組結果指定條件。今天開始學習SQL的視圖和子查詢&#xff0c;還有數據庫關聯與嵌套查詢內容的學習。一、視圖1.1視圖是有單固定存儲可反復讀取使用的子查詢&#xff0c;所以視圖適用于頻繁使用…

POJ 1195 Mobile phones【 二維樹狀數組 】

題意&#xff1a;基礎的二維數組&#xff0c;注意 0 lowbit(0)會陷入無限循環----- 之前做一道一維的一直tle,就是因為這個-------------------------- 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #includ…

mysql 交叉連接的用法_深入理解MySQL的外連接、內連接、交叉連接

1、內聯接(典型的聯接運算&#xff0c;使用像 或 <> 之類的比較運算符)。包括相等聯接和自然聯接。內聯接使用比較運算符根據每個表共有的列的值匹配兩個表中的行。例如&#xff0c;檢索 students和courses表中學生標識號相同的所有行。2、外聯接。外聯接可以是左向外聯…

基于Angularjs實現分頁

前言 學習任何一門語言前肯定是有業務需求來驅動你去學習它&#xff0c;當然ng也不例外&#xff0c;在學習ng前我第一個想做的demo就是基于ng實現分頁&#xff0c;除去基本的計算思路外就是使用指令封裝成一個插件&#xff0c;在需要分頁的列表頁面內直接引用。 插件 在封裝分頁…

mbot機器人初體驗_[首發開箱]Makeblock mBot Ranger mBot游俠版 強大的STEM教育機器人...

本帖最后由 ahagowo 于 2016-4-17 08:38 編輯mBot游俠機器人套件是一個三種功能于一身的STEM教育機器人套件&#xff0c;它支持3種組裝形態&#xff1a;機器人坦克&#xff0c;三輪賽車&#xff0c;和自平衡車。mBot游俠可通過 iPad&#xff0c;平板計算機或筆記本計算機來編程…

mysql數據庫設計規范_MYSQL數據庫設計規范與原則

MYSQL數據庫設計規范1、數據庫命名規范采用26個英文字母(區分大小寫)和0-9的自然數(經常不需要)加上下劃線_組成;命名簡潔明確(長度不能超過30個字符);例如&#xff1a;user, stat, log, 也可以wifi_user, wifi_stat, wifi_log給數據庫加個前綴;除非是備份數據庫可以加0-9的自然…

jar亂放問題

之前看到一個項目不能繼承類SimpleTagSuppert類&#xff0c;而將jsp-api.jar&#xff08;不知道servlet-api.jar能不能放&#xff09;放入到了 jdk/jre/lib/ext包下面結果不僅正在寫的jsp不能運行&#xff0c;以前的web應用也不能運行&#xff0c;會出現 java.lang.ClassNotFo…

python課程筆記_Python課程筆記(一)

由于新冠狀病毒的爆發&#xff0c;不得不在家里上網課&#xff0c;開課已經兩個禮拜了&#xff0c;今天上完Python課后&#xff0c;準備整理一下最近學習Python的筆記。人生苦短&#xff0c;我用Python一、Hello World初學一門新的語言&#xff0c;就一定要從Hello World開始pr…

Bootstrap系列 -- 41. 帶表單的導航條

有的導航條中會帶有搜索表單,在Bootstrap框架中提供了一個“navbar-form”&#xff0c;使用方法很簡單&#xff0c;在navbar容器中放置一個帶有navbar-form類名的表單。navbar-left”讓表單左浮動&#xff0c;更好實現對齊。在Bootstrap框架中&#xff0c;還提供了“navbar-rig…

mysql log table_mysqlbinlog功能擴展--table參數

目的mysqlbinlog在分析mysql的binlog日志時&#xff0c;有時需要針對某個表的操作進行分析。但是這個表屬于“冷數據”&#xff0c;操作記錄相對較少&#xff0c;而其他表操作往往很頻繁&#xff0c;binlog日志量特別大。尤其是當binlog的模式設置為ROW時&#xff0c;情況就更加…

python遞歸迭代_Python入門基礎知識點(python迭代器和遞歸)

函數名的使用&#xff1a;函數名是一個變量, 但它是一個特殊的變量, 與括號配合可以執行函數的變量函數名的內存地址&#xff1a;deffunc():passprint(func) #函數的內存地址結果&#xff1a;函數名可以賦值給其他變量&#xff1a;deffunc():print(1)afunca()func()#函數名可以…

怎么調處vs2010的MSDN幫助文檔

如果裝的是vs2010專業版的話 直接按F1直接可調出在線的幫助 直接按F2可以調出本機版的 轉載于:https://www.cnblogs.com/fag888/p/5789159.html

redis的lrange_thinkphp5操作redis系列教程】列表類型之lRange,lGetRange

namespace app\admin\controller;use think\cache\driver\Redis;use think\Controller;use \think\Db;class Index extends Controller{//獲取redispublic function getRedis(){$redis new \Redis();$redis->connect(127.0.0.1,6379);$redis->auth(root); //redis密碼ec…

如何寫好博客

好的博客是用來解決問題的&#xff0c;每一篇文章都應該以如何解決問題為驅動力&#xff0c;而不是知識點的累加&#xff0c;比如說之前寫的[MVC]系列&#xff0c;均為知識點的堆積&#xff0c;沒有例子和代碼&#xff0c;也沒有說明問題&#xff0c;這樣的文章&#xff0c;基本…

云服務器建站原理_云服務器cvm與建站主機之間的區別

(文章來源&#xff1a;西部數碼)云服務器cvm與建站主機區別是什么&#xff1f;cvm的英文全拼是CloudVirtualMachine(云虛擬機)&#xff0c;所以云服務器cvm是指虛擬云服務器&#xff0c;屬于云服務器產品中的一種。而建站主機一般多是指虛擬主機&#xff0c;是在服務器中劃分出…

Magento--判斷checkout中是否使用了coupon code

在checkout頁面中&#xff0c;如果想判斷顧客是否有使用coupon code&#xff0c;可以通過checkout session來進行判斷。以下代碼會返回checkout中使用的coupon code或者返回空&#xff08;當沒有使用coupon code時&#xff09; 1 <?php 2 3 $coupon_code Mage::getSingl…

啟動python內核時發生錯誤_啟動內核時出錯

我一直看到這個消息。在An error ocurred while starting the kernelTraceback (most recent call last):File "C:\Users\Excel\Anaconda3\lib\runpy.py", line 193, in _run_module_as_main"__main__", mod_spec)File "C:\Users\Excel\Anaconda3\lib…

Scala筆記

1、伴生對象 形如&#xff1a; 有一個類 class Test{ } 一個object和該類同名 object Test{ } object Test的作用類似于靜態類&#xff08;工具類&#xff09;&#xff0c;其中的所有成員都是靜態的&#xff0c;在object Test中可以直接訪問class Test的成員&#xff1b;…

maven找到mysql 連接池_在Tomcat6.0+MySQL5.0環境下配置和使用數據庫連接池

一&#xff0c;在Tomcat中配置連接池的JNDI首先到MySQL的網站上下載MySQL JDBC連接器放到%CATALINA_HOME%/lib目錄下&#xff0c;在%CATALINA_HOME%/conf目錄下找到context.xml&#xff0c;這個文件是全局的&#xff0c;如果想只對特定的應用使用可以編輯WEB-INF/context.xml文…