欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一篇文章學會java死鎖與CPU 100%的排查

 更新時間:2021年08月24日 11:46:20   作者:阿飛云  
這篇文章主要介紹了一篇文章學會java死鎖與CPU 100%的排查,文中主要介紹了Java死鎖以及服務器CPU占用率達到100%時的排查和解決方法,感興趣的朋友一起來看一看吧

00 本文簡介

作為一名搞技術的程序猿或者是攻城獅,想必你應該是對下面這兩個問題有所了解,說不定你在實際的工作或者面試就有遇到過:

第一個問題:Java死鎖如何排查和解決?

第二個問題:服務器CPU占用率高達到100%排查和解決?

第三個問題:有哪些工具能夠快速查看線程使用情況?

本文對這三個問題進行總結整理,通過實例演示講解,精彩干貨,不容錯過??!

前戲就這么多,高潮會很多,做好了,讓我們直奔主題,發(fā)動小船,Let's go!

小船

01 Java死鎖排查和解決

要排查和解決死鎖,首先思考三個問題:

1. 什么是死鎖?

2. 為什么會出現(xiàn)死鎖?

3. 怎么排查代碼中出現(xiàn)了死鎖?

4. 如何避免寫出死鎖的代碼?

作為技術人員(工程師),在出現(xiàn)問題的時候,能夠盡快的去解決這個問題。但是在學習技術知識的時候,還是腳踏實地,多問一些為什么,一個好的問題,能夠讓自己思考,這方面的能力也一定要鍛煉鍛煉哦,這樣才能更好的理解和掌握知識,并探究/觸碰到更深入的地方。

1、啥是死鎖?

死鎖是指兩個或兩個以上的進程在執(zhí)行過程中,由于競爭資源或者由于彼此通信而造成的一種阻塞的現(xiàn)象,若無外力作用,它們都將無法推進下去。此時稱系統(tǒng)處于死鎖狀態(tài)或系統(tǒng)產生了死鎖,這些永遠在互相等待的進程稱為死鎖進程。[百度百科:死鎖]

死鎖圖示

注:進程和線程都可以發(fā)生死鎖,只要滿足死鎖的條件!

2、為啥子會出現(xiàn)死鎖?

從上面的概念中我們知道

(1)必須是兩個或者兩個以上進程(線程)

(2)必須有競爭資源

3、怎么排查代碼中出現(xiàn)了死鎖?【重點來了】

首先整一個死鎖的代碼,看例子:

死鎖小demo

上面這段代碼執(zhí)行后,就會出現(xiàn)死鎖,那么排查的方法有如下:

第一個姿勢:使用 jps + jstack

:在windons命令窗口,使用jps -l【不會使用jps請自行查詢資料】

jps -l 命令

:使用 jstack -l 12316 【不會使用jstack請自行查詢資料】

jstack

第二個姿勢:使用jconsole

在window打開 JConsole,JConsole是一個圖形化的監(jiān)控工具!

:在windons命令窗口 ,輸出 JConsole,如下圖:

這里寫圖片描述

:選擇到線程的tab上,如下截圖。

這里寫圖片描述

第三個姿勢:使用Java Visual VM

在window打開 jvisualvm,jvisualvm是一個圖形化的監(jiān)控工具!

:在windons命令窗口 ,輸出 jvisualvm

Java Visual VM

:依然是切換到線程這個TAB上,很明顯的就有提示!

死鎖檢測

4、如何避免死鎖?

上面說了死鎖出現(xiàn)的原因以及通過三種方式來檢測和排查死鎖,下面更重要的東西來了,就是如何避免死鎖,如果能夠讓寫出的代碼避免死鎖出現(xiàn)也就沒有上面這些排查的過程了。最好的是從源頭控制問題,而不是后期遇到問題在去填坑。

我看了阿里巴巴中最新的開發(fā)規(guī)約,里面有對避免死鎖的說明,具體如下:


【強制】對多個資源、數據庫表、對象同時加鎖時,需要保持一致的加鎖順序,否則可能會
造成死鎖。
說明:線程一需要對表 A、B、C 依次全部加鎖后才可以進行更新操作,那么線程二的加鎖順序也必須是
A、B、C,否則可能出現(xiàn)死鎖。


02、Java CPU 100% 排查技巧

第一個姿勢,步驟有點多,難度四星

平時多積累一點,這樣在遇到問題的時候就少句求人的話。如果在實際的開發(fā)中遇到CPU 100%問題,要怎么排查呢?如果你沒有遇到過這個問題,請先自己思考10s,如果你遇到過,這個時候也正好可以在回顧一遍。

、 使用top命令查看cpu占用資源較高的PID

top命令

當前占用cup100% 的PID為3455。

、通過jps找到當前用戶下的java程序PID

這步可省略,主要是通過jps知道是那個JAVA服務的PID

執(zhí)行jps -l能夠打印出所有的應用的PID,找到有一個PID和這個cpu使用100%一樣的ID?。。【椭朗悄囊粋€服務了。知道了對應的服務,在接著后續(xù)的分析步驟。

、 使用 pidstat -p < PID > 1 3 -u -t

如果這個命令 pidstat不可用,這步可使用 top -H -p pid 查詢進程下線程信息

-p:指定進程號
-u:默認的參數,顯示各個進程的cpu使用統(tǒng)計
-t:顯示選擇任務的線程的統(tǒng)計信息外的額外信息

這里寫圖片描述
這里寫圖片描述

、找到cpu占用較高的線程TID ,通過上圖發(fā)現(xiàn)是 3467的TID占用cup較大

、 因為jstack命令輸出文件記錄的線程ID是16進制。因此我們先將TID轉換為十六進制的表示方式,轉換方式可以參考下圖。

3467轉為十六進制 d8d,注意是小寫!! 記錄下來,后面會使用。

巧轉進制

、通過jstack [-l] PID輸出當前進程的線程信息

jstack PID  /temp/test.log

、查找 TID對應的線程(輸出的線程id為十六進制),找到對應的代碼,使用命令查找哦,不要肉眼比對,具體命令請思考,給你表現(xiàn)機會。

查找

找到之后具體分析這個線程在干什么,為什么會占用這么多的 CUP資源。

PS:線程的幾種狀態(tài)如下說明:

NEW,未啟動的。不會出現(xiàn)在Dump中。
RUNNABLE,在虛擬機內執(zhí)行的。
BLOCKED,受阻塞并等待監(jiān)視器鎖。
WATING,無限期等待另一個線程執(zhí)行特定操作。
TIMED_WATING,有時限的等待另一個線程的特定操作。
TERMINATED,已退出的。

第二個姿勢,待開發(fā)[奸笑臉]

此處省略…,好多字。

03 推薦兩個高效排查問題工具

show-busy-java-threads

在這里插入圖片描述

官網地址:show-busy-java-threads: https://github.com/oldratlee/useful-scripts/blob/master/docs/java.md#-show-busy-java-threads

簡單安裝和使用過程:

下載 show-busy-java-threads上傳服務器,然后進行解壓然后執(zhí)行對應的命令

這里寫圖片描述

:阿里開源的問題定位神器 arthas 來定位問題。

官網地址:arthas :https://alibaba.github.io/arthas/index.html

這個里面有很多命令,如thread 支持一鍵展示當前最忙的前N個線程并打印堆棧,最簡單的 thread -n 10 即可將最忙碌的十個線程快照打印出來,真正高效。

在這里插入圖片描述

定位神器 arthas 安裝過程就做介紹了,如果你還沒有用過這個工具,我建議一定去用一下,說不定你會愛上它!

04 總結

本文內容比較多,基本上是手把手的教程了,希望能夠對你有所幫助,也建議沒有遇到類似問題的伙伴,看完之后一定要親自去實踐一下操作過程,如果沒有環(huán)境可以自行想辦法搞一個測試例子。還是老話:不要眼高手低,看了和做了本質上兩個概念,最終收獲的也一定不同。

05 彩蛋-另一個姿勢

也可以通過使用jstack找到系統(tǒng)的代碼性能問題

1、在進行壓力測試的時候,使用jps找到應用的PID

2、然后使用jstack輸出出壓力測試時候應用的dump信息

3、分析輸出的日志文件中那個方法block線程占用最多,這里可能是性能有問題,找到對應的代碼分析

到此這篇關于一篇文章學會java死鎖與CPU 100%的排查的文章就介紹到這了,更多相關java死鎖與CPU 100%的排查內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 詳解Spring @Autowired 注入小技巧

    詳解Spring @Autowired 注入小技巧

    這篇文章主要介紹了詳解Spring @Autowired 注入小技巧,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • spring boot啟動時加載外部配置文件的方法

    spring boot啟動時加載外部配置文件的方法

    這篇文章主要給大家介紹了關于spring boot啟動時加載外部配置文件的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2018-02-02
  • SpringBoot+Druid開啟監(jiān)控頁面的實現(xiàn)示例

    SpringBoot+Druid開啟監(jiān)控頁面的實現(xiàn)示例

    本文主要介紹了SpringBoot+Druid開啟監(jiān)控頁面的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-06-06
  • Java安全編碼:防范Java安全漏洞的最佳實踐

    Java安全編碼:防范Java安全漏洞的最佳實踐

    Java作為一種跨平臺的編程語言,在廣泛應用的同時,也會從時至時出現(xiàn)安全漏洞,這些漏洞可能會對Java應用程序的安全性造成嚴重威脅,因此,必須采取必要的措施,以確保Java應用程序的安全性,以最佳實踐來防范Java安全漏洞,是應對安全威脅的最好方法之一,
    2024-01-01
  • JPA配置詳解之jpaProperties用法

    JPA配置詳解之jpaProperties用法

    這篇文章主要介紹了JPA配置詳解之jpaProperties用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • java調用ffmpeg實現(xiàn)轉換視頻

    java調用ffmpeg實現(xiàn)轉換視頻

    這篇文章主要為大家詳細介紹了java調用ffmpeg實現(xiàn)轉換視頻功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • 淺談JVM內存溢出的幾種方式與解決方法

    淺談JVM內存溢出的幾種方式與解決方法

    內存溢出分為兩大類:OutOfMemoryError和StackOverflowError,以下舉出10個內存溢出的情況,并通過實例代碼的方式講解了是如何出現(xiàn)內存溢出的,感興趣的可以了解一下
    2024-01-01
  • JAVA得到數組中最大值和最小值的簡單實例

    JAVA得到數組中最大值和最小值的簡單實例

    這篇文章主要介紹了JAVA得到數組中最大值和最小值的簡單實例,需要的朋友可以參考下
    2014-08-08
  • 詳細總結各種排序算法(Java實現(xiàn))

    詳細總結各種排序算法(Java實現(xiàn))

    下面小編就為大家?guī)硪黄敿毧偨Y各種排序算法(Java實現(xiàn))。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • java中的connection reset 異常處理分析

    java中的connection reset 異常處理分析

    本文主要介紹了java中的connection reset 異常處理分析的相關資料,具有很好的參考價值。下面跟著小編一起來看下吧
    2017-04-04

最新評論