天天看點

JVM性能調優監控工具 - jdb

jdb

server:

- JDK 9 or later:-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005
    - JDK 5 - 8:-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
    - JDK 1.4.x:-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
    - JDK 1.3.x or earlier:-Xnoagent -Djava.compiler=NONE -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
           

client:

jdb <options> <class> <arguments>

[options]
-help                   -- 列印輔助資訊并退出
-sourcepath <directories separated by ";">
                        -- 要在其中查找源檔案的目錄
-attach <address>       -- 使用标準連接配接器附加到指定位址處正在運作的VM
-listen <address>       -- 等待正在運作的VM使用标準連接配接器在指定位址處連接配接
-listenany              -- 等待正在運作的VM使用标準連接配接器在任何可用位址處連接配接
-launch                 -- 立即啟動VM而不是等待'run'指令
-listconnectors         -- 列出此VM中的可用連接配接器
-connect <connector-name>:<name1>=<value1>,... 
                        -- 使用所列參數值通過指定的連接配接器連接配接到目标VM
-dbgtrace [flags]       -- 輸出資訊供調試jdb
-tclient                -- 在HotSpot(TM)客戶機編譯器中運作應用程式
-tserver                -- 在HotSpot(TM)伺服器編譯器中運作應用程式

轉發到被調試程序的選項:
-v -verbose[:class|gc|jni]
                        -- 啟用詳細模式
-D<name>=<value>        -- 設定系統屬性
-classpath <directories separated by ";">
                        -- 列出要在其中查找類的目錄
-X<option>              -- 非标準目标VM選項

-------------------
connectors              -- 列出此VM中可用的連接配接器和傳輸
run [class [args]]      -- 開始執行應用程式的主類
threads [threadgroup]   -- 列出線程
thread <thread id>      -- 設定預設線程
suspend [thread id(s)]  -- 挂起線程(預設值:all)
resume [thread id(s)]   -- 恢複線程(預設值:all)
where [<thread id> | all] 
                        -- dump線程的堆棧
wherei [<thread id> | all]
                        -- dump線程的堆棧,以及pc資訊
up [n frames]           -- 上移線程的堆棧
down [n frames]         -- 下移線程的堆棧
kill <thread id> <expr> -- 終止具有給定的異常錯誤對象的線程
interrupt <thread id>   -- 中斷線程
print <expr>            -- 輸出表達式的值
dump <expr>             -- 輸出所有對象資訊
eval <expr>             -- 對表達式求值(與print相同)
set <lvalue> = <expr>   -- 想字段/變量/數組元素配置設定新值
locals                  -- 輸出目前堆棧幀中的所有本地變量
classes                 -- 列出目前已知的類
class <class id>        -- 顯示已命名類的詳細資料
methods <class id>      -- 列出類的方法
fields <class id>       -- 列出類的字段
threadgroups            -- 列出線程組
threadgroup <name>      -- 設定目前線程組
stop in <class id>.<method>[(argument type,...)]
                        -- 在方法中設定斷點
stop in <class id>:<line>
                        -- 在行中設定斷點
clear <class id>.<method>[(argument type,...)] 
                        -- 清除方法中的斷點
clear <class id>:<line> -- 清除行中的斷點
clear                   -- 列出斷點
catch [uncaught|caught|all] <class id>|<class pattern>
                        -- 出現指定的異常錯誤時中斷
ignore [uncaught|caught|all] <class id>|<class pattern>
                        -- 對于指定的異常錯誤,取消'catch'
watch [access|all] <class id>.<field name>
                        -- 監視對字段的通路/修改
unwatch [access|all] <class id>.<field name>
                        -- 停止監視對字段的通路/修改
trace [go] methods [thread]
                        -- 跟蹤方法進入和退出,除非指定'go',否則挂起所有線程
untrace [methods]       -- 停止跟蹤方法進入和/或退出
step                    -- 執行目前行
step up                 -- 一直執行,知道目前方法傳回到其調用方
stepi                   -- 執行目前指令,下一步,步進一行(步過調用)
cont                    -- 從斷點出繼續執行
list [line number|method]
                        -- 輸出源代碼
use (或 sourcepath) [source file path]
                        -- 顯示或更改源路徑
exclude [<class pattern>, ... | "none"]
                        -- 對于指定的類,不報告步驟或方法時間
classpath               -- 從目标VM輸出類路徑資訊
monitor <command>       -- 每次程式停止時執行指令
monitor                 -- 列出螢幕
unmonitor <monitor#>    -- 删除螢幕
read <filename>         --讀取并執行指令檔案
lock <expr>             -- 輸出對象的鎖資訊
threadlocks [thread id] -- 輸出線程的鎖資訊
pop                     -- 通過目前幀出棧,且包含目前幀
reenter                 -- 與pop相同,但重新進入目前幀
redefine <class id> <class file name>
                        -- 重新定義類的代碼
disablegc <expr>        -- 禁止對象的垃圾收集
enablegc <expr>         -- 允許對象的垃圾收集
!!                      -- 重複執行最後一個指令
<n> <command>           -- 将指令重複執行n次
# <command>             -- 放棄(無操作)
help (或 ?)             -- 列出指令
version                 -- 輸出版本資訊
exit (或quit)           -- 退出調試器

<class id>:帶有程式包限定符的完整類名
<class pattern>:帶有前導或尾随通配符('*')的類名
<thread id>:'threads'指令中報告的線程編号
<expr>:Java(TM)程式設計語言表達式。支援大多數常見文法。

可以将啟動指令置于"jdb.ini"或".jdbrc"中
位于user.home或user.dir中
           
jdb -attach 5005
           

https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr011.html

https://docs.oracle.com/javase/7/docs/technotes/tools/windows/jdb.html

https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jdb.html