六種Java線程狀態及jstack命令詳解

来源:https://www.cnblogs.com/ydswin/p/18079362
-Advertisement-
Play Games

一、六種Java線程狀態 新建狀態(New):當創建一個Thread實例後,線程就處於新建狀態。此時線程對象已經被分配了記憶體,並初始化了其成員變數的值。 就緒狀態(Runnable):也被稱為“可執行狀態”。當調用了線程的start()方法後,線程就進入了就緒狀態。此時線程已經具備了執行的條件,等待 ...


一、六種Java線程狀態

  1. 新建狀態(New):當創建一個Thread實例後,線程就處於新建狀態。此時線程對象已經被分配了記憶體,並初始化了其成員變數的值。
  2. 就緒狀態(Runnable):也被稱為“可執行狀態”。當調用了線程的start()方法後,線程就進入了就緒狀態。此時線程已經具備了執行的條件,等待CPU調度執行。
  3. 運行狀態(Running):當CPU調度到某個線程時,該線程就進入了運行狀態。此時線程正在執行其代碼邏輯。
  4. 阻塞狀態(Blocked):當線程在執行過程中發生IO操作(如等待讀寫數據、等待網路連接等)或者調用了Thread.sleep()、wait()、join()等方法時,線程會進入阻塞狀態。此時線程會暫時停止執行,等待阻塞條件解除。
  5. 等待狀態(Waiting):當線程調用了wait()、join()、park()等方法後,線程會進入等待狀態。與阻塞狀態不同的是,等待狀態是線程主動放棄CPU使用權,而阻塞狀態是線程由於某種原因被迫放棄CPU使用權。在等待狀態中,線程需要等待其他線程的通知或中斷才能繼續執行。
  6. 終止狀態(Terminated):當線程運行結束或者異常結束時,線程就會進入終止狀態。此時線程已經完成了其生命周期,不會再被調度執行。

需要註意的是,線程的狀態轉換並不是任意的,而是遵循一定的規則。例如,線程從新建狀態只能通過start()方法進入就緒狀態,而不能直接進入運行狀態;線程從運行狀態只能通過阻塞或等待操作進入阻塞或等待狀態,而不能直接進入終止狀態等。同時,線程的狀態轉換也受到操作系統和JVM的調度和管理。

jstack是Java虛擬機(JVM)提供的一個非常有用的命令行工具,它允許開發人員和系統管理員在運行時獲取Java應用程式的線程堆棧跟蹤。通過分析這些堆棧跟蹤,可以深入瞭解Java應用程式的運行狀態,以及可能出現的性能問題、死鎖、資源爭用等問題。下麵將對jstack命令進行詳細解釋,包括其使用方式、參數選項、以及實際應用場景等。

二、jstack命令的基本使用

jstack命令的基本語法格式是:jstack [options] pid,其中options是可選的參數,pid是目標Java進程的進程ID。在Windows系統中,可以使用任務管理器或tasklist命令獲取Java進程的進程ID;在Linux或Unix系統中,可以使用ps命令來獲取。

一旦獲取到Java進程的進程ID,就可以使用jstack命令來列印該進程的線程堆棧信息。例如,jstack -l 12345命令將列印進程ID為12345的Java進程的線程堆棧信息,並顯示關於鎖的詳細信息(由於使用了-l選項)。

三、jstack命令的參數選項

jstack命令提供了多個參數選項,以便更靈活地獲取線程堆棧信息。以下是一些常用的參數選項:

  • -l:長格式輸出,顯示關於鎖的詳細信息。這有助於診斷死鎖和其他與鎖相關的問題。
  • -m:列印Java幀和本地C/C++幀的混合信息。這有助於瞭解Java代碼與本地代碼之間的交互情況。但請註意,該選項可能會增加輸出的複雜性和大小。
  • -F:當目標進程不響應時強制列印堆棧信息。這通常用於診斷掛起的進程或無法響應的進程。但請註意,強制列印可能會對目標進程產生影響,甚至可能導致其崩潰。因此,在使用該選項時應格外小心。

除了上述常用選項外,jstack命令還支持其他更高級的參數選項,如指定遠程調試埠等。但這些選項通常只在特定場景下使用,因此在這裡不再贅述。

四、jstack命令的應用場景

jstack命令在多個場景下都非常有用,以下是其中一些常見的應用場景:

1. 診斷死鎖:當Java應用程式出現死鎖時,可以使用jstack命令列印線程堆棧信息,並分析哪些線程在等待哪些資源。通過分析這些信息,可以找出死鎖的原因並解決它。
2. 分析性能問題:當Java應用程式出現性能問題時(如響應時間過長、CPU使用率過高等),可以使用jstack命令獲取線程堆棧信息,並查看哪些線程在執行哪些操作。這有助於找出性能瓶頸併進行優化。
3. 監控線程狀態:使用jstack命令可以實時監控Java應用程式的線程狀態,包括正在運行的線程、等待的線程以及阻塞的線程等。這有助於瞭解應用程式的運行狀態併進行相應的調整。
4. 分析core dump文件:當Java應用程式崩潰並生成core dump文件時,可以使用jstack命令分析該文件並獲取崩潰時的線程堆棧信息。這有助於找出崩潰的原因併進行修複。

五、jstack常用命令

  1. jstack [pid]

    這是最基本的jstack命令用法,其中[pid]是目標Java進程的進程ID。此命令將列印出目標Java進程中所有線程的堆棧跟蹤。

  2. jstack -l [pid]

    使用-l選項可以列印出關於鎖的附加信息,包括java.util.concurrent的ownable synchronizers列表。這對於診斷死鎖和其他鎖相關的問題非常有用。

  3. jstack -m [pid]

    -m選項將列印出Java和native C/C++ frames的混合信息。這有助於瞭解Java代碼與本地代碼之間的交互,但請註意輸出的複雜性可能會增加。

  4. jstack -F [pid]

    當目標Java進程無響應時,可以使用-F選項強制列印堆棧信息。但是,請謹慎使用此選項,因為強制列印可能會對目標進程產生影響,甚至可能導致其崩潰。

  5. jstack [pid] > output.txt

    這個命令將jstack的輸出重定向到一個名為output.txt的文件中,以便於後續分析和保存。

  6. jstack -l [pid] | grep "BLOCKED"

    這個命令結合使用了jstack和grep命令,用於查找處於BLOCKED狀態的線程。這有助於快速定位可能存線上程阻塞或死鎖的問題。

  7. jstack -l [pid] | grep "WAITING"

    類似於上一個命令,這個命令用於查找處於WAITING狀態的線程。這有助於瞭解哪些線程正在等待資源或鎖。

  8. jstack -l [pid] | grep "java.lang.Thread.State"

    這個命令用於列印出所有線程的線程狀態信息。通過分析這些狀態信息,可以瞭解Java應用程式的線程活動情況。

請註意,以上命令中的[pid]應替換為實際的目標Java進程的進程ID。此外,還可以在jstack命令的輸出中使用其他文本處理工具(如awk、sed等)進行進一步的分析和處理。

使用jstack時,請確保您具有足夠的許可權來訪問目標Java進程的信息。在某些情況下,可能需要以管理員或root用戶的身份運行jstack命令。

本文來自博客園,作者:dashery,轉載請註明原文鏈接:https://www.cnblogs.com/ydswin/p/18079362


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

-Advertisement-
Play Games
更多相關文章
  • 在開發各種應用程式時,我們經常需要對文件系統中的文件或文件夾進行實時監測,以便在文件內容改變、文件被創建或刪除時能夠及時做出反應。在 C# 中,System.IO.FileSystemWatcher 類為我們提供了這樣一個強大的功能。 一、引入 FileSystemWatcher 類 首先,在項目中 ...
  • 我個人編寫的庫,在我個人網站,小程式等很多地方都在使用中,大家可以搜索小程式 什邡市宅貓君網路工作室 或者到我的網站 store.zhaimaojun.cn 去體驗支付和登錄效果。 本庫主要實現了native pay(二維碼支付)jsapi pay(小程式直接調起支付),需要註意的是這是基於api3 ...
  • 這是我自己個人編寫的日誌記錄,主要使用在只需要記錄日誌,偶爾到文件中查看一下日誌記錄的情況。我自己寫的一些服務之類的是使用了這個的,代碼很少,使用很簡單。 第一步 搜索和安裝我的Nuget包 搜索和安裝zmjtool這個包,我寫的,如下圖: 第二步 引入namespace和創建logger對象 1 ...
  • 支持.Net/.Net Core/.Net Framework,可以部署在Docker, Windows, Linux, Mac。 RabbitMQ作為一款主流的消息隊列工具早已廣受歡迎。相比於其它的MQ工具,RabbitMQ支持的語言更多、功能更完善。 1.發送消息、獲取消息、使用消息 本文提供一 ...
  • 前言 異常的處理在我們應用程式中是至關重要的,在 dotNet 中有很多異常處理的機制,比如MVC的異常篩選器, 管道中間件定義try catch捕獲異常處理亦或者第三方的解決方案Hellang.Middleware.ProblemDetails等。MVC異常篩選器不太靈活,對管道的部分異常捕獲不到 ...
  • 讓我先把相關的報錯信息通過文字貼到下方,方便被檢索出來 出錯了! (warning!) curl error code=403; 系統錯誤 (explorer.editor.fileGet) explorer/editor.class.php[64] IO::fileSubstr(0,1,2) bi ...
  • 通過視頻幀圖片提取,圖片批量裁剪,轉換為BMP文件並取模,獲得顯示屏代碼,基於STC32單片機,在8x8點陣LED模塊上實現動畫播放。 ...
  • 本文主要學習 FreeRTOS 互斥量的相關知識,包括優先順序翻轉問題、優先順序繼承、死鎖現象、創建/刪除互斥量 和 獲取/釋放互斥量等知識 ...
一周排行
    -Advertisement-
    Play Games
  • C#TMS系統代碼-基礎頁面BaseCity學習 本人純新手,剛進公司跟領導報道,我說我是java全棧,他問我會不會C#,我說大學學過,他說這個TMS系統就給你來管了。外包已經把代碼給我了,這幾天先把增刪改查的代碼背一下,說不定後面就要趕鴨子上架了 Service頁面 //using => impo ...
  • 委托與事件 委托 委托的定義 委托是C#中的一種類型,用於存儲對方法的引用。它允許將方法作為參數傳遞給其他方法,實現回調、事件處理和動態調用等功能。通俗來講,就是委托包含方法的記憶體地址,方法匹配與委托相同的簽名,因此通過使用正確的參數類型來調用方法。 委托的特性 引用方法:委托允許存儲對方法的引用, ...
  • 前言 這幾天閑來沒事看看ABP vNext的文檔和源碼,關於關於依賴註入(屬性註入)這塊兒產生了興趣。 我們都知道。Volo.ABP 依賴註入容器使用了第三方組件Autofac實現的。有三種註入方式,構造函數註入和方法註入和屬性註入。 ABP的屬性註入原則參考如下: 這時候我就開始疑惑了,因為我知道 ...
  • C#TMS系統代碼-業務頁面ShippingNotice學習 學一個業務頁面,ok,領導開完會就被裁掉了,很突然啊,他收拾東西的時候我還以為他要旅游提前請假了,還在尋思為什麼回家連自己買的幾箱飲料都要叫跑腿帶走,怕被偷嗎?還好我在他開會之前拿了兩瓶芬達 感覺感覺前面的BaseCity差不太多,這邊的 ...
  • 概述:在C#中,通過`Expression`類、`AndAlso`和`OrElse`方法可組合兩個`Expression<Func<T, bool>>`,實現多條件動態查詢。通過創建表達式樹,可輕鬆構建複雜的查詢條件。 在C#中,可以使用AndAlso和OrElse方法組合兩個Expression< ...
  • 閑來無聊在我的Biwen.QuickApi中實現一下極簡的事件匯流排,其實代碼還是蠻簡單的,對於初學者可能有些幫助 就貼出來,有什麼不足的地方也歡迎板磚交流~ 首先定義一個事件約定的空介面 public interface IEvent{} 然後定義事件訂閱者介面 public interface I ...
  • 1. 案例 成某三甲醫預約系統, 該項目在2024年初進行上線測試,在正常運行了兩天後,業務系統報錯:The connection pool has been exhausted, either raise MaxPoolSize (currently 800) or Timeout (curren ...
  • 背景 我們有些工具在 Web 版中已經有了很好的實踐,而在 WPF 中重新開發也是一種費時費力的操作,那麼直接集成則是最省事省力的方法了。 思路解釋 為什麼要使用 WPF?莫問為什麼,老 C# 開發的堅持,另外因為 Windows 上已經裝了 Webview2/edge 整體打包比 electron ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...