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

java堆棧跟蹤工具jstack的使用教程

 更新時間:2023年11月14日 08:41:25   作者:242030  
jstack(stack?trace?for?java)是java虛擬機自帶的一種堆棧跟蹤工具,主要用于生成java虛擬機當(dāng)前時刻的線程快照,下面我們就來學(xué)習(xí)一下它的具體使用吧

1、jstack介紹

jstack(stack trace for java)是java虛擬機自帶的一種堆棧跟蹤工具。

jstack主要用于生成java虛擬機當(dāng)前時刻的線程快照,線程快照是當(dāng)前java虛擬機內(nèi)每一條線程正在執(zhí)行的方法堆棧的集合,生成線程快照的主要目的是定位線程出現(xiàn)長時間停頓的原因,如線程間死鎖、死循環(huán)、請求外部資源導(dǎo)致的長時間等待等。

線程出現(xiàn)停頓的時候通過jstack來查看各個線程的調(diào)用堆棧,就可以知道沒有響應(yīng)的線程到底在后臺做什么事情,或者等待什么資源。

jstack主要分為兩個功能:

  • 針對活著的進程做本地的或遠程的線程dump
  • 針對core文件做線程dump

當(dāng)指定的進程在64位Java虛擬機上運行時,可能需要指定-J-d64選項,例如:jstack -J-d64 -m pid。

2、線程狀態(tài)

線程通常有下面5中狀態(tài):

1、新建狀態(tài)(New): 新創(chuàng)建了一個線程對象。

2、就緒狀態(tài)(Runnable) :線程對象創(chuàng)建后,其他線程調(diào)用了該對象的start()方法。該狀態(tài)的線程位于可運行線程池中,變得可運行,等待獲取CPU的使用權(quán)。

3、運行狀態(tài)(Running): 就緒狀態(tài)的線程獲取了CPU,執(zhí)行程序代碼。

4、阻塞狀態(tài)(Blocked): 阻塞狀態(tài)是線程因為某種原因放棄CPU使用權(quán),暫時停止運行。直到線程進入就緒狀態(tài),才有機會轉(zhuǎn)到運行狀態(tài)。阻塞的情況分三種:

等待阻塞:運行的線程執(zhí)行wait()方法,JVM會把該線程放入等待池中。

同步阻塞:運行的線程在獲取對象的同步鎖時,若該同步鎖被別的線程占用,則JVM會把該線程放入鎖池中。

其他阻塞:運行的線程執(zhí)行sleep()或join()方法,或者發(fā)出了I/O請求時,JVM會把該線程置為阻塞狀態(tài)。

當(dāng)sleep()狀態(tài)超時、join()等待線程終止或者超時、或者I/O處理完畢時,線程重新轉(zhuǎn)入就緒狀態(tài)。

5、死亡狀態(tài)(Dead):線程執(zhí)行完了或者因異常退出了run()方法,該線程結(jié)束生命周期。

關(guān)于線程狀態(tài),具體也可以查看:java.lang.Thread.State類。

想要通過jstack命令來分析線程的情況的話,首先要知道線程都有哪些狀態(tài),下面這些狀態(tài)是我們使用jstack命

令查看線程堆棧信息時可能會看到的線程的幾種狀態(tài):

  • RUNNABLE,線程運行中或I/O等待
  • BLOCKED,線程被阻塞,在等待monitor鎖(synchronized關(guān)鍵字)
  • TIMED_WAITING ,線程在等待喚醒,但設(shè)置了時限
  • WAITING ,線程在無限等待喚醒

在線程的堆棧中,需要特別留意以下幾種狀態(tài):

  • Deadlock: 死鎖(重點關(guān)注)
  • Waiting on condition: 等待資源(重點關(guān)注)
  • Waiting on monitor entry : 等待獲取監(jiān)視器(重點關(guān)注)
  • Blocked :阻塞(重點關(guān)注)
  • Runnable :執(zhí)行中
  • Suspended : 暫停
  • Object.wait()或TIME_WAITING :對象等待中
  • Parked : 停止

3、jstack命令格式

jstack [ option ] pid
jstack [ option ] executable core
jstack [ option ] [server-id@]remote-hostname-or-IP

pid:Java進程的ID,可以通過jps命令查詢到。

executable: 產(chǎn)生core dump的Java可執(zhí)行程序。

core:要打印的堆棧跟蹤的核心文件。

server-id:當(dāng)多個DEBUG服務(wù)器在同一遠程主機上運行時,可使用的可選唯一ID。

remote-hostname-or-IP:遠程DEBUG的服務(wù)器主機名或IP地址。

pid: 需要被打印配置信息的java進程id,可以用jps查詢。

常用參數(shù)說明:

-F:當(dāng) jstack [-l] pid 沒有響應(yīng)時,強制打印一個堆棧轉(zhuǎn)儲。

-l:打印關(guān)于鎖的其他信息,比如擁有的java.util.concurrent ownable同步器的列表,會使得JVM停頓得長久得多。

-m:打印包含Java和本機C/ C++幀的混合模式堆棧跟蹤。

-h:打印幫助信息。

-help:打印幫助信息。

3.1 jstack pid

第一行各個單詞的解析,

daemon:線程名稱 。

prio:線程優(yōu)先級

tid:指Java Thread id。

nid:指native線程的id。。

[0x000000002369e000]:線程棧起始地址。

3.2 死循環(huán)

package com.example.controller;

public class Test2 {

    public static void main(String[] args) {
        while (true) {
        }
    }
    
}

3.3 Object.wait()情況

package com.example.controller;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Test3 {
    static class TestTask implements Runnable {
        @Override
        public void run() {
            synchronized (this) {
                try {
                    //等待被喚醒
                    wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) {
        ExecutorService ex = Executors.newFixedThreadPool(1);
        ex.execute(new TestTask());
    }
}

3.4 死鎖情況

package com.example.controller;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Test4 {

    public static void main(String[] args) {
        Object obj1 = new Object();
        Object obj2 = new Object();
        ExecutorService ex = Executors.newFixedThreadPool(2);
        // 起10個線程
        for (int i = 0; i < 10; i++) {
            int order = i % 2 == 0 ? 1 : 0;
            ex.execute(new TestTask(order, obj1, obj2));
        }
    }

    static class TestTask implements Runnable {
        private Object obj1;
        private Object obj2;
        private int order;

        public TestTask(int order, Object obj1, Object obj2) {
            this.order = order;
            this.obj1 = obj1;
            this.obj2 = obj2;
        }

        public void test1() throws InterruptedException {
            synchronized (obj1) {
                synchronized (obj2) {
                    System.out.println("test。。。");
                }
            }
        }

        public void test2() throws InterruptedException {
            synchronized (obj2) {
                synchronized (obj1) {
                    System.out.println("test。。。");
                }
            }
        }

        @Override
        public void run() {
            while (true) {
                try {
                    if (this.order == 1) {
                        this.test1();
                    } else {
                        this.test2();
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

3.5 等待io

package com.example.controller;

import java.io.IOException;
import java.io.InputStream;

public class Test5 {

    public static void main(String[] args) throws IOException {
        InputStream is = System.in;
        int i = is.read();
        System.out.println("exit。");
    }

}

以上就是java堆棧跟蹤工具jstack的使用教程的詳細內(nèi)容,更多關(guān)于java jstack的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Spring中的Actuator使用詳解

    Spring中的Actuator使用詳解

    這篇文章主要介紹了Spring中的Actuator使用詳解,在生產(chǎn)環(huán)境中運行的程序,并不總是穩(wěn)定、安靜、正確的,往往會遇到各式各樣的現(xiàn)場狀況,這個時候,就需要獲取該程序足夠多的運行狀態(tài)信息,然后分析并對其進行有效管理,需要的朋友可以參考下
    2023-09-09
  • mybatis group by substr函數(shù)傳參報錯的解決

    mybatis group by substr函數(shù)傳參報錯的解決

    這篇文章主要介紹了mybatis group by substr函數(shù)傳參報錯的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • SpringBoot使用maven實現(xiàn)多環(huán)境運行和打包的操作步驟

    SpringBoot使用maven實現(xiàn)多環(huán)境運行和打包的操作步驟

    在開發(fā)過程中,需要不斷進行環(huán)境的切換和打包部署,maven提供了多環(huán)境配置,可以方便實現(xiàn)不同環(huán)境的配置切換和打包,本文通過代碼示例給大家介紹的非常詳細,需要的朋友可以參考下
    2024-04-04
  • mybatis 無參構(gòu)造器的使用

    mybatis 無參構(gòu)造器的使用

    本文主要介紹了MyBatis中無參構(gòu)造器的重要性和應(yīng)用,無參構(gòu)造器在Java類中具有特殊的意義,它確保了即使在沒有提供任何參數(shù)的情況下,也能夠創(chuàng)建對象并對其進行初始化,下面就來介紹一下
    2024-10-10
  • springboot 集成pgsql+mybatis plus的詳細步驟

    springboot 集成pgsql+mybatis plus的詳細步驟

    集成 Spring Boot、PostgreSQL 和 MyBatis Plus 的步驟與 MyBatis 類似,只不過在 MyBatis Plus 中提供了更多的便利功能,如自動生成 SQL、分頁查詢、Wrapper 查詢等,下面分步驟給大家介紹springboot 集成pgsql+mybatis plus的過程,感興趣的朋友一起看看吧
    2023-12-12
  • 利用IDEA社區(qū)版創(chuàng)建SpringBoot項目的詳細圖文教程

    利用IDEA社區(qū)版創(chuàng)建SpringBoot項目的詳細圖文教程

    大家應(yīng)該都知道Idea社區(qū)版本,默認是不能創(chuàng)建SpringBoot項目的,下面這篇文章主要給大家介紹了關(guān)于利用IDEA社區(qū)版創(chuàng)建SpringBoot項目的詳細圖文教程,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-04-04
  • MyBatis接口的簡單實現(xiàn)原理分析

    MyBatis接口的簡單實現(xiàn)原理分析

    這里僅僅舉個簡單例子來說明原理,不是完全針對MyBatis的,這種思想我們也可以應(yīng)用在其他地方。地mybatis接口實現(xiàn)原理感興趣的朋友一起看看吧
    2017-07-07
  • 基于Springboot實現(xiàn)JWT認證的示例代碼

    基于Springboot實現(xiàn)JWT認證的示例代碼

    本文主要介紹了基于Springboot實現(xiàn)JWT認證,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • SpringBoot前后端分離實現(xiàn)驗證碼操作

    SpringBoot前后端分離實現(xiàn)驗證碼操作

    驗證碼的功能是防止非法用戶惡意去訪問登錄接口而設(shè)置的一個功能,今天我們就來看看在前后端分離的項目中,SpringBoot是如何提供服務(wù)的
    2022-05-05
  • 解決IDEA maven 項目修改代碼不生效,mvn clean、install后才生效

    解決IDEA maven 項目修改代碼不生效,mvn clean、install后才生效

    這篇文章主要介紹了解決IDEA maven 項目修改代碼不生效,mvn clean、install后才生效的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09

最新評論

寻甸| 饶平县| 舟山市| 平定县| 临湘市| 保山市| 元谋县| 青州市| 陈巴尔虎旗| 志丹县| 登封市| 潜江市| 上杭县| 宜宾县| 达拉特旗| 中西区| 固阳县| 平罗县| 太康县| 普洱| 七台河市| 赤水市| 武强县| 苍溪县| 桃园市| 和硕县| 武山县| 长汀县| 平阳县| 赣州市| 吕梁市| 澎湖县| 浙江省| 开鲁县| 鄂伦春自治旗| 吴旗县| 邵东县| 介休市| 夹江县| 冷水江市| 全椒县|