從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處理序,讓其輸出執行緒傾印到標準輸出。
-
執行此命令以執行此操作:
kill -QUIT <pid>
您可能需要以
sudo -u user kill -QUIT <pid>
身分執行此命令,其中「user」是Java處理序執行身分的使用者。 -
如果您使用
crx-quickstart/server/start
指令碼啟動CQSE,則您的執行緒傾印將會輸出到crx-quickstart/server/logs/startup.log
。 如果您使用協力廠商應用程式伺服器(例如JBoss、WebSphere、Tomcat或其他),請參閱伺服器檔案以找出要將標準輸出導向哪個檔案。
Windows:
JDK 1.X
- 下載javadump.exe (附於下方)。
- 使用以下三個引數啟動JVM (它們的順序必須正確):
-XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile= C:\temp\jvmoutput.log
- 按Ctrl+Shift+Esc開啟「工作管理員」。
- 尋找Java程式的PID。
- 從命令列,執行:
javadump.exe <pid>
- 執行緒傾印會出現在步驟2提及的
jvmoutput.log
檔案中。
JDK 1.6
使用外掛程式,從 jconsole 工具取得執行緒傾印: [
0]
以下說明如何請求對話串傾印:
- 將下列引數新增至執行Communique的jvm:
Dcom.sun.management.jmxremote
- 下載並安裝JDK 1.6 (如果尚未完成)。
- 下載並解壓縮執行緒傾印分析器公用程式。
[
1]
- 執行
jconsole.exe
/ JDK 1.6:jconsole.exe -pluginpath /path/to/file/tda.jar
- 按一下 執行緒傾印 索引標籤。
- 按一下 要求執行緒傾印 連結。
注意: 如果您正在執行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執行緒和監視器傾印分析器。