從JVM進行對話串傾印

對話串傾印是Java虛擬機器器(JVM)中目前作用中的所有Java對話串的清單。 本文討論在Adobe Experience Manager中從JVM取得對話串傾印的幾種方法。

說明 description

環境

Adobe Experience Manager

問題/症狀

如何從Linux、UNIX或Windows上的JVM取得對話串傾印?

對話串傾印是Java虛擬機器器(JVM)中目前作用中的所有Java對話串的清單。

有數種方法可以從JVM進行對話串傾印。 強烈建議進行1個以上的對話串傾印。 好的實務是定期進行10個對話串傾印(例如,每10秒傾印一個對話串)。

解決方法 resolution

步驟1:取得Java程式的PID

要取得對話串傾印所需的第一項資訊是Java流程的PID。

Java JDK隨附jps命令,列出所有Java程式ID。 您可以像這樣執行此命令:

jps -l 70660 sun.tools.jps.Jps 70305

注意: 在Linux和UNIX中,您可能必須以sudo -u user jps -l身分執行此命令,其中「user」是Java處理序執行身分的使用者使用者名稱。

如果這樣仍無法正常運作,或您仍找不到Java程式,(路徑未設定、未安裝JDK或較舊的Java版本),請使用

  • UNIX、Linux和Mac OS X: ps -el | grep java
  • Windows:按Ctrl+Shift+Esc開啟工作管理員並找到Java程式的PID

步驟2:向JVM請求對話串傾印

jstack

如果已安裝/可用,建議您使用 jstack 工具。 它會將對話串傾印到命令列主控台。

若要使用jstack取得對話串傾印,請執行以下命令:
jstack -l <pid>

您可以使用主控台輸出重新導向/附加指令,將連續的執行緒傾印輸出至檔案:
jstack -l <pid> >> threaddumps.log

附註:

  • jstack工具自JDK 1.5起便已推出(僅適用於Windows上的JVM,有些JDK 1.5和JDK 1.6版本才有提供)。

  • 即使已啟用-Xrs jvm引數,jstack仍可運作

  • 無法使用JDK 1.6中的jstack工具從JDK 1.5上執行的程式取得執行緒傾印。

  • 在Linux和UNIX中,您必須以擁有Java流程的使用者身分執行命令:
    sudo -u java-user jstack -l <pid>

    < java-user>應該取代為Java處理序執行身分的使用者識別碼)

  • 在Windows中,如果您執行jstack並收到「沒有足夠的可用儲存空間來處理此命令」錯誤,則您必須以Windows SYSTEM使用者或擁有Java處理序的使用者身分執行jstack。 您可以使用psexec來執行此操作,您可以在這裡下載。 若要以SYSTEM使用者身分執行jstack,請使用如下命令:

    psexec -s jstack <pid>   >> threaddumps.log

    如果您無法在伺服器上安裝psexec,則您可以建立包含命令的.bat檔案,並使用Windows工作排程器執行它(以其他使用者身分)

  • 如果Java處理程式沒有回應,則使用選項 -J-d64 (在64位元系統上)有時會有幫助,例如:
    jstack -J-d64 -l   <pid>   >> threaddumps.log

  • 如果jstack命令(jstack -l <pid> >> threaddumps.log)擲回以下錯誤[ 1],請以擁有java處理序的使用者身分執行此命令。 例如:
    sudo -u sling jstack -l <pid> >> threaddumps.log

Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 22893: Operation not permitted

sun.jvm.hotspot.debugger.DebuggerException: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 22893: Operation not permitted

...

Caused by: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 22893: Operation not permitted

...

sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal$LinuxDebuggerLocalWorkerThread.run(LinuxDebuggerLocal.java:138)

JSTACK指令碼

這是一個指令碼 (改編自eclipse.org上的指令碼),將使用jstack進行一系列對話串傾印。 它也會使用top命令來決定執行緒層級CPU的使用量。

請像這樣執行:

sudo -u <user> jstackSeries.sh
<pid> <aemserveruser> <count> <delay>

例如︰sudo -u aemuser jstackSeries.sh 1234 aemserveruser 10 3

  • 1234 是Java處理程式的pid
  • cq5serveruser 是Java處理序執行的Linux或UNIX使用者
  • 10 為要接受的執行緒傾印數
  • 3 是每個傾印之間的延遲

注意: 頂端輸出具有十進位格式的原生執行緒ID,而jstack輸出具有十六進位格式的ID。 您可以將執行緒ID轉換為十六進位,以比對從頂端輸出到jstack輸出的高cpu執行緒。

除了上述指令碼之外,我們在github🔗上也有類似的Windows Powershell指令碼和AdobeAEM特定指令碼。

取得對話串傾印的替代方法

如果 jstack 工具無法供您使用,則您可以依照下列方式執行對話串傾印:

注意: 如果啟用命令列引數-Xrs,部分工具無法從JVM進行對話串傾印。 如果您在進行對話串傾印時遇到問題,請檢查此選項是否已啟用。

UNIX、Mac OS X和Linux (JDK 1.4或更低版本)

在UNIX、Mac OS X和Linux上,您可以傳送QUIT訊號給Java處理序,讓其輸出執行緒傾印到標準輸出。

  1. 執行此命令以執行此操作:
    kill -QUIT <pid>

    您可能需要以sudo -u user kill -QUIT <pid>身分執行此命令,其中「user」是Java處理序執行身分的使用者。

  2. 如果您使用crx-quickstart/server/start指令碼啟動CQSE,則您的執行緒傾印將會輸出到crx-quickstart/server/logs/startup.log。 如果您使用協力廠商應用程式伺服器(例如JBoss、WebSphere、Tomcat或其他),請參閱伺服器檔案以找出要將標準輸出導向哪個檔案。

Windows:

JDK 1.X

  1. 下載javadump.exe (附於下方)。
  2. 使用以下三個引數啟動JVM (它們的順序必須正確):
    -XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile= C:\temp\jvmoutput.log
  3. 按Ctrl+Shift+Esc開啟「工作管理員」。
  4. 尋找Java程式的PID。
  5. 從命令列,執行: javadump.exe   <pid>
  6. 執行緒傾印會出現在步驟2提及的jvmoutput.log檔案中。

JDK 1.6

使用外掛程式,從 jconsole 工具取得執行緒傾印: [ 0]

以下說明如何請求對話串傾印:

  1. 將下列引數新增至執行Communique的jvm:
    Dcom.sun.management.jmxremote
  2. 下載並安裝JDK 1.6 (如果尚未完成)。
  3. 下載並解壓縮執行緒傾印分析器公用程式[ 1]
  4. 執行jconsole.exe / JDK 1.6:
    jconsole.exe -pluginpath /path/to/file/tda.jar
  5. 按一下 執行緒傾印 索引標籤。
  6. 按一下 要求執行緒傾印 連結。

注意: 如果您正在執行AEM 6.x,並且想要觀察執行中的執行緒,您可以要求http://<host>:<port>/system/console/status-Threads取得執行緒清單。 不過,請注意,這些對話串傾印無法用於Samurai或tda等對話串傾印分析工具。

套用至:

在JVM中執行的所有Adobe產品

對話串傾印分析工具

Microsoft檔案之Sysinternals中的[ 0] PsExec v2.42

[ 1] TDA — 執行緒傾印分析器 (在Github.com上的irockel/tda)。

在FastThread上[ 2] Java執行緒傾印分析器

IBM支援助理檔案上的Java的[ 3] IBM執行緒和監視器傾印分析器

recommendation-more-help
3d58f420-19b5-47a0-a122-5c9dab55ec7f