【JAVA 工具】jstack簡單使用,定位死迴圈、線程阻塞、死鎖等問題

来源:http://www.cnblogs.com/chenpi/archive/2016/04/11/5377445.html
-Advertisement-
Play Games

當我們運行java程式時,發現程式不動,但又不知道是哪裡出問題時,可以使用JDK自帶的jstack工具去定位; 廢話不說,直接上例子吧,在window平臺上的; 死迴圈 寫個死迴圈的程式如下: 先運行以上程式,程式進入死迴圈; 打開cmd,輸入tasklist,找到javaw.exe的PID,如下為 ...


當我們運行java程式時,發現程式不動,但又不知道是哪裡出問題時,可以使用JDK自帶的jstack工具去定位;

廢話不說,直接上例子吧,在window平臺上的;

死迴圈

寫個死迴圈的程式如下:

package concurrency;

public class Test {

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

        }
    }
}

先運行以上程式,程式進入死迴圈;

打開cmd,輸入jps命令,jps很簡單可以直接顯示java進程的pid,如下為7588:

或者輸入tasklist,找到javaw.exe的PID,如下為7588:

輸入jstack 7588命令,找到跟我們自己代碼相關的線程,如下為main線程,處於runnable狀態,在main方法的第八行,也就是我們死迴圈的位置:

Object.wait()情況

寫個小程式,調用wait使其中一線程等待,如下:

package concurrency;

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

class TestTask implements Runnable {
    @Override
    public void run() {

        synchronized (this) {
            try {
                //等待被喚醒
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }
}

public class Test {

    public static void main(String[] args) throws InterruptedException {

        ExecutorService ex = Executors.newFixedThreadPool(1);
        ex.execute(new TestTask());

    }
}

同樣我們先找到javaw.exe的PID,再利用jstack分析該PID,很快我們就找到了一個線程處於WAITING狀態,在Test.java文件13行處,正是我們調用wait方法的地方,說明該線程目前還沒等到notify,如下

死鎖

寫個簡單的死鎖例子,如下:

package concurrency;

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

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) {
            //建議線程調取器切換到其它線程運行
            Thread.yield();
            synchronized (obj2) {
                System.out.println("test。。。");
            }

        }
    }
    public void test2() throws InterruptedException {
        synchronized (obj2) {
            Thread.yield();
            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();
            }
        }

    }
}

public class Test {

    public static void main(String[] args) throws InterruptedException {
        Object obj1 = new Object();
        Object obj2 = new Object();

        ExecutorService ex = Executors.newFixedThreadPool(10);
        // 起10個線程
        for (int i = 0; i < 10; i++) {
            int order = i%2==0 ? 1 : 0;
            ex.execute(new TestTask(order, obj1, obj2));
        }

    }
}

同樣我們先找到javaw.exe的PID,再利用jstack分析該PID,很快jstack就幫我們找到了死鎖的位置,如下所示:

等待IO

寫個簡單的等待用戶輸入例子:

package concurrency;


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

public class Test {

    public static void main(String[] args) throws InterruptedException, IOException {

        InputStream is = System.in;
        int i = is.read();
        System.out.println("exit。");

    }
}

同樣我們先找到javaw.exe的PID,再利用jstack分析該PID,很快jstack就幫我們找到了位置,Test.java文件12行,如下所示:

 

其它

像調用sleep使線程進入睡眠,suspend()暫停線程等就不舉例了,都是類似的;

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 註:下麵用 [$] 標註的表示收費工具,但部分收費工具針對開源軟體的開發/部署/托管是免費的) 目錄 API 應用框架(Application Frameworks) 應用模板(Application Templates) 人工智慧(Artificial Intelligence) 程式集處理(As ...
  • flex 訪問WebService的方法有很多種,使用FLEX4中的"數據/服務"功能可以自動生成訪問WebService的代理類,這樣可以避免把所有的數據訪問都寫到MXML頁面上,便於重覆利用,同時可以直接導入後臺自定義數據類型,方便傳參。 直接上代碼:其中WebService介面 ? 1 2 3 ...
  • 閱讀目錄 開始 簡單使用 非同步調用WebServeices WebServices驗證 相關概念及資源 WebServices:簡單理解--解決了不同平臺之間應用程式間通信的問題,數據以XML格式在程式間傳輸 實際的應用場景:例如 比價網 為什麼比價網可以從眾多的電商站點獲得用戶搜索的產品數據?We ...
  • 首先來說,委托的作用就是可以給類的方法傳遞其他類的方法而不必將類實例化。第二點,委托就是事件和響應事件的方法的橋梁(就是傳遞響應事件的方法給事件)。這裡要註意,委托跟類平級,事件與方法平級。 全文 事件與委托似乎很難以理解,這是因為它們的使用方式與常用的編碼有很大的差別,例如通常編寫的都是同步代碼, ...
  • 分類:Unity、C#、VS2015 創建日期:2016-04-11 一、簡介 在地形編輯器一節中,已經告訴了你如何使用已經創建好的樹來形成大片樹林。這一節告訴你在 Unity 5.3.4中如何利用【樹木創建器】一步一步地創建一棵樹: 當你學會了創建樹的基本操作後,你就可以根據自己的需要創建任意形狀... ...
  • 先拿出我半前年前平臺的設計初稿,經過半年的努力我已經完成了該設計稿的所有功能。並且理念已經遠遠超出該設計稿。 下麵是一些博友對我貼子的評價: 1、樓主,想法很美好,現實很骨感,我們公司就有一套你說的這樣的平臺,界面都是用XML配置出來的,雖然開發效率很高,但只能做固定版式的系統,有任何版式的修改,幾 ...
  • 這幾個月一直忙APP的項目,沒來得及更新項目,想想該抽出時間整理一下開發思路,跟大家分享,同時也希望得到寶貴的建議。 先說一下我們的許可權管理的的設計思路,首先一個企業信息化管理系統一定會用到許可權管理, 那麼一個動態的菜單在企業信息化管理系統占有一定的分量。 下麵介紹我的一些思路。 由於原聲的winf ...
  • SignalR支持多種伺服器和客戶端配置。此外,每種傳輸方式都有自身的要求限制;如果某種傳輸方式不被系統支持,SignalR能夠優雅地將故障轉移到其他類型的傳輸方式。關於SignalR所支持的傳輸方式的詳細信息,參見: Transports and Fallbacks。 系統要求 SignalR服務 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...