從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版本才有提供)。

  • jstack即使在 -Xrs jvm引數已啟用

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

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

    (< java-user> 應取代為Java流程執行身分的使用者id)

  • 在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執行緒。

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

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

如果 jstack 工具無法供您使用,然後您可以依照以下步驟進行對話串傾印:

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

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. 如果您使用啟動CQSE crx-quickstart/server/start 指令碼,然後您的對話串傾印將輸出到 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. 對話串傾印將出現在 jvmoutput.log 步驟2中提到的檔案。

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產品

對話串傾印分析工具

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

[ 1] TDA — 對話串傾印分析器 在Github.com上的irockel/tda。

[ 2] Java對話串傾印分析器 在FastThread上。

[ 3] IBM執行緒和監視器傾印分析器 適用於Java on IBM支援助理檔案。

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