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

利用JStack排查死鎖問(wèn)題和CPU100%問(wèn)題

 更新時(shí)間:2023年12月26日 10:28:15   作者:日上三桿快起床  
無(wú)論是再面試過(guò)程中還是再實(shí)際項(xiàng)目開(kāi)發(fā)當(dāng)中我們都有可能遇到這兩個(gè)問(wèn)題如何利用JStack排查死鎖問(wèn)題和CPU100%問(wèn)題,文中給出了詳細(xì)的排查過(guò)程和解決方法,需要的朋友可以參考下

1、工具JStack是什么?

JStack可以顯示Java應(yīng)用程序中每個(gè)線(xiàn)程的堆棧跟蹤,幫助開(kāi)發(fā)人員診斷線(xiàn)程相關(guān)的問(wèn)題,比如死鎖和性能問(wèn)題。通過(guò)使用JStack,開(kāi)發(fā)人員可以查看線(xiàn)程的狀態(tài)、鎖定信息以及線(xiàn)程調(diào)用堆棧,從而更好地理解應(yīng)用程序的運(yùn)行狀況。

1.1命令介紹:

  • jstack [-l] <pid>:這個(gè)命令會(huì)生成指定Java進(jìn)程的線(xiàn)程轉(zhuǎn)儲(chǔ)。-l選項(xiàng)會(huì)同時(shí)顯示關(guān)于鎖的附  加信息。
  • jstack -F [-m] [-l] <pid>:這個(gè)命令會(huì)在Java進(jìn)程響應(yīng)時(shí)生成線(xiàn)程轉(zhuǎn)儲(chǔ)。-m選項(xiàng)會(huì)同時(shí)顯示Java和本地堆棧信息。
  • jstack -m [-l] <pid>:這個(gè)命令會(huì)同時(shí)顯示Java和本地堆棧信息。
  • jstack -h:這個(gè)命令會(huì)顯示幫助信息,列出所有可用的選項(xiàng)。

再其中有兩個(gè)名詞java堆棧、本地堆棧,可能有些不太理解:

  • Java堆棧信息:顯示了每個(gè)線(xiàn)程在Java虛擬機(jī)中的調(diào)用堆棧。這些信息包括了線(xiàn)程當(dāng)前執(zhí)行的方法、類(lèi)名等。
  • 本地堆棧信息:顯示了每個(gè)線(xiàn)程在本地方法中的調(diào)用堆棧。本地方法是使用本地語(yǔ)言(如C或C++)編寫(xiě)的方法,通常用于與操作系統(tǒng)或硬件交互。

2、解決死鎖問(wèn)題

解決死鎖問(wèn)題我們最先就要定位到哪里發(fā)生了死鎖。我先準(zhǔn)備一段一定發(fā)生死鎖的程序,然后讓他再服務(wù)器運(yùn)行,然后我們來(lái)利用工具JStack來(lái)定位死鎖。

public class Demo {
 static Lock lock1 = new ReentrantLock();
 static Lock lock2 = new ReentrantLock();
 public static void deathLock() {
            Thread t1 = new Thread() {
                @Override
                public void run() {
                    try {
                        lock1.lock();
                        System.out.println(Thread.currentThread().getName() + " get the lock1");
                        Thread.sleep(1000);
                        lock2.lock();
                        System.out.println(Thread.currentThread().getName() + " get the lock2");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            };
            Thread t2 = new Thread() {
                @Override
                public void run() {
                    try {
                        lock2.lock();
                        System.out.println(Thread.currentThread().getName() + " get the lock2");
                        Thread.sleep(1000);
                        lock1.lock();
                        System.out.println(Thread.currentThread().getName() + " get the lock1");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            };
            //設(shè)置線(xiàn)程名字,方便分析堆棧信息
            t1.setName("mythread-jay");
            t2.setName("mythread-tianluo");
            t1.start();
            t2.start();
        }
public static void main(String[] args) {
 
        deathLock();
    }
}

再代碼中線(xiàn)程“mythread-jay”持有鎖lock1等待lock2,"mythread-tianluo"線(xiàn)程持有l(wèi)ock2等待lock1 。那么這兩個(gè)線(xiàn)程就會(huì)嘗試死鎖?;ハ嗟却?/p>

此時(shí)我們通過(guò)jps命令查看這個(gè)進(jìn)程的進(jìn)程號(hào):

那么此時(shí)我們得知了進(jìn)程號(hào)就可以 使用JStack工具了。

那么我們就得到了一大串的字符描述進(jìn)程執(zhí)行情況,那么我們?nèi)フ谊P(guān)于這兩個(gè)線(xiàn)程的信息,由下面兩張圖我們可以看出兩個(gè)線(xiàn)程都處于Wait狀態(tài),造成了死鎖的情況,這個(gè)工具原原本本的給我們展示出來(lái)了,那我們也就知道了原因,就可以著手解決了:

3、解決CPU100%問(wèn)題

造成CPU100%問(wèn)題的原因有很多種,無(wú)限循環(huán)、過(guò)多的線(xiàn)程、大量的計(jì)算等都有可能,那么我們這次通過(guò)無(wú)限循環(huán)來(lái)達(dá)到CPU100%效果。

那么我們看到CPU百分百,我們可以使用top命令查看哪個(gè)進(jìn)程占用CPU過(guò)高。

top,   我們看到進(jìn)程號(hào)為10413的java進(jìn)程CPU利用率高達(dá)96.7%

那么得知是這個(gè)進(jìn)程出的問(wèn)題,那么我們就進(jìn)一步深入的去看是這個(gè)進(jìn)程中哪些線(xiàn)程導(dǎo)致的問(wèn)題了。 使用命令top -Hp <PID>,一看是線(xiàn)程號(hào)為10548的線(xiàn)程搞得鬼,那么我們就可以使用JStack工具對(duì)這個(gè)線(xiàn)程進(jìn)行檢查了。

使用 jstack 10548 命令, 得到這個(gè)線(xiàn)程的信息,我們可以觀察得到這個(gè)線(xiàn)程是為數(shù)不多處于RUNNABLE狀態(tài)的線(xiàn)程,他正在執(zhí)行Demo1Applocation類(lèi)的第27行,那么這個(gè)第27行也正是無(wú)限循環(huán)所在。那么這個(gè)罪魁禍?zhǔn)滓舱业搅恕?/p>

以上就是利用JStack排查死鎖問(wèn)題和CPU100%問(wèn)題的詳細(xì)內(nèi)容,更多關(guān)于JStack排查死鎖和CPU100%的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Spring Boot 文件上傳原理解析

    Spring Boot 文件上傳原理解析

    Spring Boot 文件上傳原理其實(shí)就是Spring MVC,因?yàn)檫@部分工作是Spring MVC做的而不是Spring Boot,那么,SpringMVC又是怎么處理文件上傳這個(gè)過(guò)程的呢?下面通過(guò)本文給大家詳細(xì)介紹下,一起看看吧
    2018-03-03
  • Javaweb實(shí)現(xiàn)上傳下載文件的多種方法

    Javaweb實(shí)現(xiàn)上傳下載文件的多種方法

    本篇文章主要介紹了Javaweb實(shí)現(xiàn)上傳下載文件,有多種實(shí)現(xiàn)方式,需要的朋友可以參考下。
    2016-10-10
  • 深入剖析Java編程中的序列化

    深入剖析Java編程中的序列化

    這篇文章主要介紹了深入剖析Java編程中的序列化,文中談到了序列化時(shí)對(duì)象的繼承等各種問(wèn)題,案例詳盡,強(qiáng)烈推薦!需要的朋友可以參考下
    2015-07-07
  • Java Swing GridBagLayout網(wǎng)格袋布局的實(shí)現(xiàn)

    Java Swing GridBagLayout網(wǎng)格袋布局的實(shí)現(xiàn)

    這篇文章主要介紹了Java Swing GridBagLayout網(wǎng)格袋布局的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • Redis緩存策略超詳細(xì)講解

    Redis緩存策略超詳細(xì)講解

    實(shí)際開(kāi)發(fā)中緩存處理是必須的,不可能我們每次客戶(hù)端去請(qǐng)求一次服務(wù)器,服務(wù)器每次都要去數(shù)據(jù)庫(kù)中進(jìn)行查找,為什么要使用緩存?說(shuō)到底是為了提高系統(tǒng)的運(yùn)行速度
    2022-09-09
  • java 創(chuàng)建線(xiàn)程的四種方式

    java 創(chuàng)建線(xiàn)程的四種方式

    這篇文章主要介紹了java 創(chuàng)建線(xiàn)程的四種方式,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-11-11
  • Spring Boot+Mybatis+Druid+PageHelper實(shí)現(xiàn)多數(shù)據(jù)源并分頁(yè)的方法

    Spring Boot+Mybatis+Druid+PageHelper實(shí)現(xiàn)多數(shù)據(jù)源并分頁(yè)的方法

    這篇文章主要給大家介紹了關(guān)于Spring Boot+Mybatis+Druid+PageHelper實(shí)現(xiàn)多數(shù)據(jù)源并分頁(yè)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們來(lái)一起看看吧
    2018-05-05
  • 淺談Spring bean 生命周期驗(yàn)證

    淺談Spring bean 生命周期驗(yàn)證

    本篇文章主要介紹了淺談Spring bean 生命周期驗(yàn)證,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10
  • Spring Boot中使用RSocket的示例代碼

    Spring Boot中使用RSocket的示例代碼

    這篇文章主要介紹了Spring Boot中使用RSocket的示例代碼,特別是spring boot 如何幫助抽象出更低級(jí)別的RSocket API,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • Java分析講解序列化與字典功能的序列化

    Java分析講解序列化與字典功能的序列化

    在項(xiàng)目開(kāi)發(fā)地過(guò)程中經(jīng)常會(huì)用到字典存儲(chǔ)某些可配置的值,但相應(yīng)的也會(huì)給開(kāi)發(fā)帶來(lái)復(fù)雜度,比如數(shù)據(jù)庫(kù)存儲(chǔ)的值為字典值:0,1,2,3這種類(lèi)型的值,但是前端頁(yè)面卻需要展示為 啟動(dòng)、禁用、刪除 等中文狀態(tài),下面我們來(lái)看兩種解決方案
    2022-06-06

最新評(píng)論