JVM調優工具--Arthas(二)進階


基礎命令

help——查看命令幫助信息

cat——打印文件內容,和linux里的cat命令類似

echo–打印參數,和linux里的echo命令類似

grep——匹配查找,和linux里的grep命令類似

tee——復制標准輸入到標准輸出和指定的文件,和linux里的tee命令類似

pwd——返回當前的工作目錄,和linux命令類似

cls——清空當前屏幕區域,類似linux中的clear

session——查看當前會話的信息

 

reset——重置增強類,將被 Arthas 增強過的類全部還原,Arthas 服務端關閉時會重置所有增強過的類

version——輸出當前目標 Java 進程所加載的 Arthas 版本號

history——打印命令歷史

quit——退出當前 Arthas 客戶端,其他 Arthas 客戶端不受影響

stop——關閉 Arthas 服務端,所有 Arthas 客戶端全部退出

keymap——Arthas快捷鍵列表及自定義快捷鍵

jvm相關

dashboard——當前系統的實時數據面板

 

 

 thread——查看當前 JVM 的線程堆棧信息

參數名稱 參數說明
id 線程id
[n:] 指定最忙的前N個線程並打印堆棧
[b] 找出當前阻塞其他線程的線程
[i <value>] 指定cpu占比統計的采樣間隔,單位為毫秒
 

當沒有參數時,顯示所有線程的信息

支持一鍵展示當前最忙的前N個線程並打印堆棧

thread id, 顯示指定線程的運行堆棧

thread -b, 找出當前阻塞其他線程的線程

有時候我們發現應用卡住了, 通常是由於某個線程拿住了某個鎖, 並且其他線程都在等待這把鎖造成的。 為了排查這類問題, arthas提供了thread -b, 一鍵找出那個罪魁禍首

 注意, 目前只支持找出synchronized關鍵字阻塞住的線程, 如果是java.util.concurrent.Lock, 目前還不支持。

thread -i, 指定采樣時間間隔

thread –state ,查看指定狀態的線程

  

jvm——查看當前 JVM 的信息

THREAD相關

  • COUNT: JVM當前活躍的線程數

  • DAEMON-COUNT: JVM當前活躍的守護線程數

  • PEAK-COUNT: 從JVM啟動開始曾經活着的最大線程數

  • STARTED-COUNT: 從JVM啟動開始總共啟動過的線程次數

  • DEADLOCK-COUNT: JVM當前死鎖的線程數

文件描述符相關

  • MAX-FILE-DESCRIPTOR-COUNT:JVM進程最大可以打開的文件描述符數

  • OPEN-FILE-DESCRIPTOR-COUNT:JVM當前打開的文件描述符數

 

sysprop——查看和修改JVM的系統屬性

查看所有屬性

 查看單個屬性(支持通過TAB鍵自動補全)

修改單個屬性

 

sysenv——查看JVM的環境變量

 查看所有環境變量

查看單個環境變量(支持通過TAB鍵自動補全)

 

 

  

vmoption——查看和修改JVM里診斷相關的option

 查看所有的option

查看指定的option

更新指定的option

 

 

 perfcounter——查看當前 JVM 的Perf Counter信息

 

 

 

 

logger——查看和修改logger

getstatic——查看類的靜態屬性

ognl——執行ognl表達式

mbean——查看 Mbean 的信息

heapdump——dump java heap, 類似jmap命令的heap dump功能

class/classloader相關

sc——查看JVM已加載的類信息

“Search-Class” 的簡寫,這個命令能搜索出所有已經加載到 JVM 中的 Class 信息,這個命令支持的參數有 [d][E][f] 和 [x:]

參數名稱 參數說明
class-pattern 類名表達式匹配
method-pattern 方法名表達式匹配
[d] 輸出當前類的詳細信息,包括這個類所加載的原始文件來源、類的聲明、加載的ClassLoader等詳細信息。
如果一個類被多個ClassLoader所加載,則會出現多次
[E] 開啟正則表達式匹配,默認為通配符匹配
[f] 輸出當前類的成員變量信息(需要配合參數-d一起使用)
[x:] 指定輸出靜態變量時屬性的遍歷深度,默認為 0,即直接使用 toString 輸出
  • class-pattern支持全限定名,如com.taobao.test.AAA,也支持com/taobao/test/AAA這樣的格式,這樣,我們從異常堆棧里面把類名拷貝過來的時候,不需要在手動把/替換為.
  • sc 默認開啟了子類匹配功能,也就是說所有當前類的子類也會被搜索出來,想要精確的匹配,請打開options disable-sub-class true開關

 

 

 

sm——查看已加載類的方法信息

“Search-Method” 的簡寫,這個命令能搜索出所有已經加載了 Class 信息的方法信息。

sm 命令只能看到由當前類所聲明 (declaring) 的方法,父類則無法看到。

參數名稱 參數說明
class-pattern 類名表達式匹配
method-pattern 方法名表達式匹配
[d] 展示每個方法的詳細信息
[E] 開啟正則表達式匹配,默認為通配符匹配

 

 jad——反編譯指定已加載類的源碼

jad 命令將 JVM 中實際運行的 class 的 byte code 反編譯成 java 代碼,便於你理解業務邏輯;

  • 在 Arthas Console 上,反編譯出來的源碼是帶語法高亮的,閱讀更方便

  • 當然,反編譯出來的 java 代碼可能會存在語法錯誤,但不影響你進行閱讀理解

參數名稱 參數說明
class-pattern 類名表達式匹配
[c:] 類所屬 ClassLoader 的 hashcode
[E] 開啟正則表達式匹配,默認為通配符匹配

編譯demo.MathGame

 

反編繹時只顯示源代碼

默認情況下,反編譯結果里會帶有ClassLoader信息,通過- -source-only選項,可以只打印源代碼。方便和mc/redefine命令結合使用。

 

mc——內存編繹器,內存編繹.java文件為.class文件

Memory Compiler/內存編譯器,編譯.java文件生成.class

mc /tmp/Test.java

可以通過-c參數指定classloader:

mc -c 327a647b /tmp/Test.java

可以通過-d命令指定輸出目錄:

mc -d /tmp/output /tmp/ClassA.java /tmp/ClassB.java

編譯生成.class文件之后,可以結合redefine命令實現熱更新代碼。

注意,mc命令有可能失敗。如果編譯失敗可以在本地編譯好.class文件,再上傳到服務器。具體參考redefine命令說明。

redefine——加載外部的.class文件,redefine到JVM里

dump——dump 已加載類的 byte code 到特定目錄

classloader——查看classloader的繼承樹,urls,類加載信息,使用classloader去getResource

monitor/watch/trace相關

請注意,這些命令,都通過字節碼增強技術來實現的,會在指定類的方法中插入一些切面來實現數據統計和觀測,因此在線上、預發使用時,請盡量明確需要觀測的類、方法以及條件,診斷結束要執行 stop 或將增強過的類執行 reset 命令。

  • watch——方法執行數據觀測
  • trace——方法內部調用路徑,並輸出方法路徑上的每個節點上耗時
  • stack——輸出當前方法被調用的調用路徑
  • tt——方法執行數據的時空隧道,記錄下指定方法每次調用的入參和返回信息,並能對這些不同的時間下調用進行觀測

profiler/火焰圖

options

  • options——查看或設置Arthas全局開關

管道

Arthas支持使用管道對上述命令的結果進行進一步的處理,如sm java.lang.String * | grep 'index'

  • grep——搜索滿足條件的結果
  • plaintext——將命令的結果去除ANSI顏色
  • wc——按行統計輸出結果

后台異步任務

當線上出現偶發的問題,比如需要watch某個條件,而這個條件一天可能才會出現一次時,異步后台任務就派上用場了,詳情請參考這里

  • 使用 > 將結果重寫向到日志文件,使用 & 指定命令是后台運行,session斷開不影響任務執行(生命周期默認為1天)
  • jobs——列出所有job
  • kill——強制終止任務
  • fg——將暫停的任務拉到前台執行
  • bg——將暫停的任務放到后台執行

Web Console

通過websocket連接Arthas。

以java agent方式啟動

用戶數據回報

3.1.4版本后,增加了用戶數據回報功能,方便統一做安全或者歷史數據統計。

在啟動時,指定stat-url,就會回報執行的每一行命令,比如: ./as.sh --stat-url 'http://192.168.10.11:8080/api/stat'

在tunnel server里有一個示例的回報代碼,用戶可以自己在服務器上實現。

StatController.java

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM