搜尋
首頁Javajava教程java中如何使用JVM指令來實作伺服器故障排查

本篇文章就跟大家介紹java中使用JVM指令來實作伺服器故障排查的方法。有一定的參考價值,有需要的朋友可以參考一下,希望對你們有幫助。

一、top(Linux指令)

執行top指令:    (查看行程15477的詳細情況,下文用到)

 

#系統資訊(前五行):

    • 第1行:Top 任務佇列資訊(系統運作狀態及平均負載),與uptime指令結果相同。

      • 系統平均負載:單核心CPU情況下,0.00 表示沒有任何負荷,1.00表示剛好滿載,超過1側表示超負荷,理想值是0.7;

      • 多核心CPU負載:CPU核數* 理想值0.7 = 理想負載,例如:4核心CPU負載不超過2.8何表示沒有出現高負載。

      • 格式:up xx days, HH:MM

      • 例如:241 days, 20:11, 表示連續運行了241天20小時11分鐘

      • 第1段:系統目前時間,例如:16:07:37

      • #第2段:系統運作時間,未重新啟動的時間,時間越長系統越穩定。

      • 第3段:目前登入使用者數,例如:1 user,表示目前只有1個使用者登入

      • 第4段:系統負載,即任務佇列的平均長度,3個數值分別統計最近1,5,15分鐘的系統平均負載 

    • 第2行: Tasks 進程相關資訊 

      • 第1段:進程總數,例如:Tasks: 231 total, 表示總共執行231個進程

      • 第2段:正在執行的進程數,例如:1 running,

      • #第3段:睡眠的進程數,例如:230 sleeping,

      • #第4段:停止的行程數,例如:0 stopped,

      • #第5段:殭屍行程數,例如:0 zombie

    • 第3行:Cpus CPU相關訊息,若是多核心CPU,按數字1可顯示各核CPU訊息,此時1行將轉為Cpu核數行,數字1可以來回切換。

      • 第1段:us 用戶空間佔用CPU百分比#,例如:Cpu (s): 12.7%us,

      • 第2段:sy 核心空間佔用CPU百分比,例如:8.4%sy,

      • #第3段:ni 使用者進程空間內改變優先權的程序佔用CPU百分比,例如:0.0%ni,

      • 第4段:id 空閒CPU百分比,例如:77.1%id,

      • 第5段:wa 等待輸入輸出的CPU時間百分比,例如:0.0%wa,

      • 第6段:hi CPU服務硬體中斷所耗費的時間總額,例如:0.0%hi,

      • #第7段:si CPU服務軟中斷所耗費的時間總額,例如:1.8%si,

      • 第8段:st Steal time 虛擬機器被hypervisor偷去的CPU時間(如果目前處於hypervisor下的vm,實際上hypervisor也是要消耗部分CPU處理時間的)

    • #第4行:Mem 內存相關信息(Mem: 12196436k total, 12056552k used, 139884k free, 64564k buffers) 

      • 第1段:實體記憶體總量,例如:Mem: 12196436k total,

      • 第2段:使用的實體記憶體總量,例如: 12056552k used,

      • 第3段:空閒記憶體總量,例如:Mem: 139884k free,

      • 第4段:用作核心快取的記憶體量,例如:64564k buffers

    •  第5行:Swap 交換分區相關資訊(Swap: 2097144k total, 151016k used, 1946128k free free, 151016k used, 1946128k free 3120236k#)

      • #第1段:交換區總量,例如:Swap: 2097144k total,

      • 第2段:使用的交換區總量,例如:151016k used,

      • 第3段:空閒交換區總量,例如:1946128k free,

      • #第4段:緩衝的交換區總量,3120236k cached

 

進程資訊:

  在top指令中按f按可查看顯示的列信息,按對應字母開啟/關閉列,大寫字母表示開啟,小寫字母表示關閉。帶*號的是預設列。

    • A: PID = (Process Id) 程式Id;

    • ################################################################ ######E: ###USER### = (User Name) 進程擁有者的使用者名稱;###
    • H: PR = (Priority) 優先權

    • ##I: 

      NI = (Nice value) nice值。負值表示高優先權,正值表示低優先權

    • O: VIRT = (Virtual Image (kb)) 行程使用的虛擬記憶體總量,單位kb。 VIRT=SWAP RES

    • Q: RES = (Resident size (kb)) 進程使用的、未被換出的實體內存大小,單位kb。 RES=CODE DATA

    • T: 

      SHR = (Shared Mem size (kb)) 共享記憶體大小,單位kb

    • #W: 

      S = (Process Status) 行程狀態。 D=不可中斷的睡眠狀態,R=運作,S=睡眠,T=追蹤/停止,Z=殭屍行程

    • K: % CPU = (CPU usage) 上次更新到現在的CPU時間佔用百分比

    • N: %MEM  = (Memory usage (RES)) 進程使用的實體記憶體百分比

    • M: 

      TIME = (CPU Time, hundredths ) 行程使用的CPU時間總計,單位1/100秒 b: 
      PPID = (Parent Process Pid) 父行程Id c: 
      RUSER = (Real user name) d: 
      UID = (User Id) 進程擁有者的使用者id f: 
      GROUP = (Group Name) 進程擁有者的群組名稱 g: 
      TTY = (Controlling Tty) 啟動進程的終端名稱。不是從終端機啟動的程序則顯示為? j: 
      P = (Last used cpu (SMP)) 最後使用的CPU,僅在多CPU環境下有意義 p: 
      SWAP = (Swapped size (kb)) 進程使用的虛擬記憶體中,被換出的大小,單位kb l: 
      TIME = (CPU Time) 進程使用的CPU時間總計,單位秒 r: 
      CODE = (Code size (kb)) 可執行程式碼佔用的物理記憶體大小,單位kb s: 
      DATA = ( Data Stack size (kb)) 可執行程式碼以外的部分(資料段堆疊)所佔用的實體記憶體大小,單位kb u: 
      nFLT = (Page Fault count) 頁面錯誤次數 # v: 
      nDRT = (Dirty Pages count) 最後一次寫入到現在,被修改過的頁數 y: 
      WCHAN = (Sleeping in Function) 若該行程在睡眠,則顯示睡眠中的系統函數名稱 z: 
      Flags = (Task Flags <sched.h>) 任務標誌,參考sched.h</sched.h>

    • #X: 

      COMMAND = (Command name/line) 指令名稱/命令列

參考  Linux效能分析工具top指令詳解

執行top -Hp PID,如top -Hp 15477

查看某行程中的執行緒  

註:此時PID是執行緒id

#如線程15571有異常需要查看,使用jstack列印堆疊,查看線程15571狀態(15571 16進位=3cd3)

#二、jstack

 參考 java指令--jstack 工具

    Java指令學習系列(二)-Jstack

  需要到JDK安裝目錄下使用(可透過ps xjava設定進程,得到jdk安裝目錄)

  ./jstack PID(進程id)   ./jstack 15477

  紅框中即為執行緒15571(16進位=3#cd3) 狀態

#分析jstack日誌:

監視器Monitor:

# # Monitor是Java中用來實現執行緒之間的互斥與協作的主要手段,它可以看成是物件或Class的鎖。

每個物件都有,也只有一個 monitor。

下面這個圖,描述了執行緒和Monitor之間關係,以及執行緒的狀態轉換:

#進入區(Entrt Set):表示線程透過synchronized要求取得物件的鎖。如果物件被鎖住,則進入擁有者;否則在進入區等待。一旦物件鎖被其他線程釋放,立即參與競爭。

######擁有者(The Owner):表示某一執行緒成功競爭到物件鎖定。 ######

等待區(Wait Set):表示執行緒通過物件的object.wait()方法,釋放物件的鎖定,並在等待區等待被喚醒。

從圖中可以看出,一個Monitor在某個時刻,只能被一個執行緒擁有,該執行緒就是 <span style="font-family: " microsoft yahei>Active Thread</span> ,而它執行緒都是 <span style="font-family: " microsoft yahei>Waiting</span> <span style="font-family: " microsoft yahei>Thread</span>,分別在兩個佇列 <span style="font-family: " microsoft yahei>Entry</span> <span style="font-family: " microsoft yahei>Set</span>和 <span style="font-family: " microsoft yahei>Wait</span> <span style="font-family: " microsoft yahei>Set</span>裡面等候。

<span style="font-family: " microsoft yahei>Entry</span> <span style="font-family: " microsoft yahei>Set</span>中等待的執行緒動作是 <span style="font-family: " microsoft yahei>Waiting for monitor entry</span>。

在 <span style="font-family: " microsoft yahei>Wait</span> <span style="font-family: " microsoft yahei>Set</span>#中等待的執行緒動作是 <span style="font-family: " microsoft yahei>in Object.wait()</span>當一個執行緒申請進入臨界區時,它就進入了 Entry Set佇列。

(我們稱被synchronized保護起來的程式碼片段為臨界區。當一個執行緒申請進入臨界區時,它就進入了「Entry Set 」佇列)

執行緒狀態:

NEW:未啟動的。不會出現在Dump。

RUNNABLE:在虛擬機器內執行的,運行中狀態。 The Owner區

BLOCKED:受阻塞並等待監視器鎖定。 在Entry Set區等鎖定

WATING:無限期等待另一個執行緒執行特定操作。 在Wait Set區等待某個condition或monitor發生,一般停留在wait()等語句裡。

TIMED_WATING:有時限的等待另一個執行緒的特定操作。 Wait Set區和WAITING的差異是wait() 等語句加上了時間限制 wait(timeout)。

TERMINATED:已退出的。

呼叫修飾

表示執行緒在方法呼叫時,額外的重要的操作。修飾上方的方法呼叫。

locked 目標:使用synchronized申請物件鎖定成功,監視器的擁有者。 The Owner區。

waiting to lock 目標:使用synchronized申請物件鎖定未成功,在Entry Set區等鎖定。執行緒狀態為Blocked

waiting on 目標:使用synchronized申請物件鎖定成功後,釋放鎖定,在Wait Set區等鎖定。執行緒狀態為WAITING或TIMED_WATING

parking to wait for 目標:呼叫了park(),在Wait Set區,等待許可。

 (park是基本的執行緒阻塞原語,不透過監視器在物件上阻塞。

  park:進入WAITING狀態,對比wait不需要取得鎖定就可以讓執行緒WAITING,透過unpark喚醒)

執行緒動作

執行緒狀態產生的原因。

runnable:The Owner區,狀態RUNNABLE

in Object.wait():呼叫wait(),Wait Set區,狀態為WAITING或TIMED_WAITING,修飾waiting on 

waiting for monitor entry:等鎖,Entry Set區,狀態BLOCKED,修飾waiting to lock

waiting on condition##:因為某種條件被park,Wait Set區,狀態為parking to wait for

#sleeping:休眠的線程,呼叫了Thread.sleep()

總結

1、查看線程dump,先看線程狀態/線程動作(比較直覺),可以確定線程目前處於哪個階段。然後看呼叫修飾及鎖情況,基本上就可以確定次執行緒是否有問題;

2、可以短時間(可能有問題的時間段)內多次列印執行緒快照,然後查看可能有問題的某一線程在這幾次的情況,可以有效查找問題。

 三、jps

類似Linux指令ps 

#參考 Java指令學習系列(一)-Jps

./jps

# ./jps -q

#./jps -m

## ./jps -l

./jps -v

# 四、jmap

##參考: Java指令學習系列(三)-Jmap

            java指令--jmap指令使用

 jmap -heap PID:堆疊使用狀況

##jmap -histo PID:物件情況

(jmap -histo:live 這個指令執行,JVM會先觸發gc,然後再統計資訊

重點看項目上的類別:[C是字串數組,String用; [B是位元組數組,網路層用到。這兩個比較大一般沒關係

  [C is a char[]

   [S is a short[ ]
   [I is a int[]
   [B is a byte[]
   [B is a byte[]
   [[I is a int[]

 

  [[I is a int[]    [[I is a int[] []總結:以上就是這篇文章的全部內容,希望能對大家的學習有所幫助。更多相關教學請造訪

Java影片教學###,## #java開發圖文教學###,###bootstrap影片教學###!###

以上是java中如何使用JVM指令來實作伺服器故障排查的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:博客园。如有侵權,請聯絡admin@php.cn刪除
如何將Maven或Gradle用於高級Java項目管理,構建自動化和依賴性解決方案?如何將Maven或Gradle用於高級Java項目管理,構建自動化和依賴性解決方案?Mar 17, 2025 pm 05:46 PM

本文討論了使用Maven和Gradle進行Java項目管理,構建自動化和依賴性解決方案,以比較其方法和優化策略。

如何使用適當的版本控制和依賴項管理創建和使用自定義Java庫(JAR文件)?如何使用適當的版本控制和依賴項管理創建和使用自定義Java庫(JAR文件)?Mar 17, 2025 pm 05:45 PM

本文使用Maven和Gradle之類的工具討論了具有適當的版本控制和依賴關係管理的自定義Java庫(JAR文件)的創建和使用。

如何使用咖啡因或Guava Cache等庫在Java應用程序中實現多層緩存?如何使用咖啡因或Guava Cache等庫在Java應用程序中實現多層緩存?Mar 17, 2025 pm 05:44 PM

本文討論了使用咖啡因和Guava緩存在Java中實施多層緩存以提高應用程序性能。它涵蓋設置,集成和績效優勢,以及配置和驅逐政策管理最佳PRA

如何將JPA(Java持久性API)用於具有高級功能(例如緩存和懶惰加載)的對象相關映射?如何將JPA(Java持久性API)用於具有高級功能(例如緩存和懶惰加載)的對象相關映射?Mar 17, 2025 pm 05:43 PM

本文討論了使用JPA進行對象相關映射,並具有高級功能,例如緩存和懶惰加載。它涵蓋了設置,實體映射和優化性能的最佳實踐,同時突出潛在的陷阱。[159個字符]

Java的類負載機制如何起作用,包括不同的類載荷及其委託模型?Java的類負載機制如何起作用,包括不同的類載荷及其委託模型?Mar 17, 2025 pm 05:35 PM

Java的類上載涉及使用帶有引導,擴展程序和應用程序類負載器的分層系統加載,鏈接和初始化類。父代授權模型確保首先加載核心類別,從而影響自定義類LOA

如何將Java的RMI(遠程方法調用)用於分佈式計算?如何將Java的RMI(遠程方法調用)用於分佈式計算?Mar 11, 2025 pm 05:53 PM

本文解釋了用於構建分佈式應用程序的Java的遠程方法調用(RMI)。 它詳細介紹了接口定義,實現,註冊表設置和客戶端調用,以解決網絡問題和安全性等挑戰。

如何使用Java的插座API進行網絡通信?如何使用Java的插座API進行網絡通信?Mar 11, 2025 pm 05:53 PM

本文詳細介紹了用於網絡通信的Java的套接字API,涵蓋了客戶服務器設置,數據處理和關鍵考慮因素,例如資源管理,錯誤處理和安全性。 它還探索了性能優化技術,我

如何在Java中創建自定義網絡協議?如何在Java中創建自定義網絡協議?Mar 11, 2025 pm 05:52 PM

本文詳細介紹了創建自定義Java網絡協議。 它涵蓋協議定義(數據結構,框架,錯誤處理,版本控制),實現(使用插座),數據序列化和最佳實踐(效率,安全性,維護

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能