由於套接字錯誤而無法執行jmap:使用「-F」選項進行強製附加
嘗試取得堆疊時使用jmap時,可能會出現「無法開啟套接字檔案」的錯誤訊息,表示目標進程無回應或HotSpot VM尚未載入。使用“-F”選項是克服此障礙的潛在解決方案。
jmap 與jmap '-F':獨特的操作模式
jmap,當在沒有「-F」標誌的情況下調用時,利用動態附加機制與目標JVM 進行通訊。此機制涉及一系列步驟:
- 在目標進程的工作目錄中建立檔案(例如.attach_pid1234)。
- 向目標進程發送 SIGQUIT 訊號,提示JVM 啟動 AttachListener 執行緒。
- 建立 UNIX 域套接字,用於從外部工具接收指令。
- 出於安全目的驗證連接套接字的憑證(euid 和 egid)。
- 連接到套接字,傳送 dumpheap 指令,並從 JVM 的 AttachListener 執行緒接收輸出。
動態附加的優點和缺點:
-
優點:
由JVM 執行的高速堆轉儲。 - 不同版本的 jmap 與 JVM 之間的相容性。
- 缺點:
僅限於與目標 JVM 相同的使用者 (euid/egid)。 -
jmap '-F' 模式:利用HotSpot 可維護性代理
或者,jmap '-F' 使用HotSpot維護性代理,提供單獨的操作模式。在這種情況下,會發生以下步驟:
在目標 JVM 上呼叫 PTRACE_ATTACH,並使用 SIGSTOP 訊號無條件掛起進程。 - 使用進程 PTRACE_PEEKDATA 讀取 JVM 記憶體由於需要一次讀取一個單詞,速度明顯較慢。
- JVM 內部結構是根據目標 JVM 版本重建的。
- 工具在復原之前產生堆轉儲目標進程。
-
「-F」模式的優點和缺點:
甚至可以應用在掛起的進程。 特權使用者(例如 root)可以轉儲其他使用者的進程。 缺點:大堆速度慢。 需要匹配版本的 jmap 和目標 JVM。 不保證安全點,可能會導致目標 JVM 狀態不一致。
以上是為什麼在遇到套接字錯誤時對 jmap 使用「-F」選項?的詳細內容。更多資訊請關注PHP中文網其他相關文章!