DUICUO

Java アプリケーション診断用の強力なツールである Arthas の詳細な分析。

序文

Arthasを導入する前は、誰もが本番環境でJavaサービスに関する問題を経験したことがあるでしょう。最も一般的なシナリオは、サードパーティAPIの呼び出し時に例外が発生し、ログに記録されず、例外のスタックトレースでは問題の原因を特定できないというものです。このような状況では、必死に様々な方法を試すしかありませんが、根本的な解決策は見つかりません。Arthasを早期に導入することで、これらの問題を簡単に解決できるだけでなく、多くの一般的なリモートサービスの問題のトラブルシューティングと解決にも役立ちます。

アルサス

Arthasは、Alibabaが提供するオープンソースのJava診断ツールです。JDK 6以降、Linux/Mac/Windowsをサポートし、コマンドライン対話モードを採用しています。また、豊富なタブ自動補完機能も備えており、問題の特定と診断を容易にします。

オープンソースアドレス: https://github.com/alibaba/arthas。

公式ドキュメント: https://github.com/alibaba/arthas。

Arthas はどのような問題の解決に役立ちますか?

  1. このクラスはどの JAR ファイルからロードされますか? クラス関連のさまざまな例外がスローされるのはなぜですか?
  2. 変更したコードが実行されないのはなぜでしょうか?コミットし忘れたのでしょうか?それともブランチが間違っているのでしょうか?
  3. オンラインでデバッグできない問題が発生した場合、ログを追加して再デプロイすることが唯一の解決策でしょうか?
  4. オンラインでユーザーのデータ処理に関する問題が発生しましたが、オンラインでデバッグしたり、オフラインで問題を再現したりできませんでした。
  5. システムの運用状態を総合的に把握できる視点はありますか?
  6. JVM のリアルタイム実行ステータスを監視するにはどのような方法がありますか?
  7. アプリケーションのホットスポットをすばやく見つけてフレーム グラフを生成するにはどうすればよいでしょうか?

Arthas(アルザス)の使用

コマンドライン対話モードを採用し、豊富なタブ自動補完機能を提供します。

1. Arthasをインストールする

 curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas - boot.jar

「潜在的な問題に注意してください」

  • このプログラムを実行するユーザーは、対象プロセスと同じ権限を持っている必要があります。例えば、管理者ユーザーとして実行するには、「sudo su admin && java -jar arthas-boot.jar」または「sudo -u admin -EH java -jar arthas-boot.jar」と入力します。
  • 対象プロセスにアタッチできない場合は、~/logs/arthas/ ​​ディレクトリ内のログを確認できます。
  • コマンド `java -jar arthas-boot.jar -h` は、より多くのパラメータ情報を出力します。

2. 適用する Java プロセスを選択します。

 java -jar arthas - boot.jar
#サービスシーケンスを選択します。`java -jar arthas -boot.jar -h`を実行すると詳細なパラメータ情報が表示されます

「**ツールが見つかりません。**」というエラー メッセージが表示される場合は、ローカル JDK へのフル パスを指定して、コマンドを実行します (例: /opt/jdk/bin/java -jar arthas-boot.jar)。

 /ライブラリ/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/bin/java-jar arthas - boot.jar 

「この画面が表示されたら、操作を開始できます。」

3. Arthasウェブコンソール

Arthasは現在、Webコンソールをサポートしています。Webコンソールは接続プロセスが成功すると自動的に起動します。http://127.0.0.1:8563/ から直接アクセスでき、ページ上の操作モードはコンソールと全く同じです。

4. よく使われるコマンド

以下は、Arthasでよく使われるコマンドの一覧です。より頻繁に使用されるコマンドについては後ほど紹介します。以降のコマンドの説明は少し難解なため、各コマンドの機能の概要を把握するためにブックマークに登録することをお勧めします。これにより、今後同様のコマンドに遭遇した場合のトラブルシューティングに役立ちます。

(1)ダッシュボードコマンド

「dashboard」と入力してEnterキーを押すと、現在のプロセスに関する情報が表示されます。実行を中断するにはCtrl+Cキーを押してください。

(2)スレッドコマンド

現在のスレッド情報とスレッドのスタック トレースを表示します。

  • -i:指定された期間内にデータを収集します。
 スレッド- i 2000 

  • -n: CPU 使用率が最も高いスレッドを識別します。
 スレッド- n 3 
 [ arthas @1 ] $ スレッド-n 3
"C1 CompilerThread1" [ 内部] cpuUsage = 2.59% deltaTime = 5ms time = 18214ms
"arthas-command-execute" Id = 2261 cpuUsage = 0.81% deltaTime = 1ms time = 119ms 実行可能
sun.management.ThreadImpl.dumpThreads0 ( ネイティブメソッド)
sun.management.ThreadImpl.getThreadInfo ( ThreadImpl .java : 448 )
com.taobao.arthas.core.command.monitor200.ThreadCommand.processTopBusyThreads ( ThreadCommand .java : 206 )
com.taobao.arthas.core.command.monitor200.ThreadCommand.process ( ThreadCommand .java : 122 )
com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl.process ( AnnotatedCommandImpl .java : 82 )
com .taobao .arthas .core .shell .command .impl .AnnotatedCommandImpl .access $100 ( AnnotatedCommandImpl .java : 18 )
com .taobao .arthas .core .shell .command .impl .AnnotatedCommandImpl $ProcessHandler.handle ( AnnotatedCommandImpl .java : 111 )
com .taobao .arthas .core .shell .command .impl .AnnotatedCommandImpl $ProcessHandler.handle ( AnnotatedCommandImpl .java : 108 )
com .taobao .arthas .core .shell .system .impl .ProcessImpl $CommandProcessTask.run ( ProcessImpl .java : 385 )
java .util .concurrent .Executors $RunnableAdapter.call ( Executors .java : 511 )
java.util.concurrent.FutureTask.run ( FutureTask .java : 266 )
java .util .concurrent .ScheduledThreadPoolExecutor $ ScheduledFutureTask .access $201 ( ScheduledThreadPoolExecutor .java : 180 )
java .util .concurrent .ScheduledThreadPoolExecutor $ScheduledFutureTask.run ( ScheduledThreadPoolExecutor .java : 293 )
java.util.concurrent.ThreadPoolExecutor.runWorker ( ThreadPoolExecutor .java : 1149 )
java .util .concurrent .ThreadPoolExecutor $Worker.run ( ThreadPoolExecutor .java : 624 )
java.lang.Thread.run ( スレッド.java : 748 )
"C2 CompilerThread0" [ 内部] cpuUsage = 0.31% deltaTime = 0ms time = 94495ms
  • -b:ロックを保持しているスレッドを検索します。リクエスト後に接続がスタックすることがあります。このメソッドは、ロックを保持しているスレッドを検索するために使用できます。このメソッドは明示的なロック、つまりロックインターフェースをサポートしていないことに注意してください。
 スレッド- b 
 [ arthas @1 ]$ スレッド-b
最もブロックしているスレッドが見つかりませ

(3)監視コマンド

このコマンドは、メソッド実行データを監視するための最も一般的で便利なコマンドの1つです。リモートサーバーで呼び出されたメソッドの入出力パラメータや例外を監視するために使用できます。

共通パラメータ:

  • -x:出力結果における属性トラバーサルの深さを指定します。デフォルト値は 1 です。
  • -b: 「メソッド呼び出し前」を観察します。
  • -e:メソッド例外の後に観察します。
  • -s: 「メソッドが返された後」を観察します。
  • -f: 「メソッドが終了した後」を観察します (正常と異常の両方が戻ります)。

メソッドの出力パラメータと戻り値を観察します。

 [ arthas @1 ]$ watch com .xx .actionlog .impl .ActionLogConfigApiImpl listTopics "{params,returnObj}" - x 2
中止するにはQ またはCtrl + C を押します
影響クラス1メソッド1コスト238 ミリ秒 リスナーID6
メソッド= com .xx .actionlog .impl .ActionLogConfigApiImpl .listTopics 場所= AtExit
ts = 2021 -05 -21 14 : 43 : 01 ; [ コスト= 135.092231ms ] 結果= @ArrayList [
@物体[][
@文字列[ K8SOFFICE ],
@String [ デフォルト],
],
@配列リスト[
@String [ 注文],
@String [ 注文ログ],
@String [ 操作ログ],
@String [ ストア],
@String [ ストア],
@String [ 場所],
@String [ タグ],
@String [ チャンネル],
@String [ サプライヤー],
@String [ 認証],
@String [ サイト],
],
]

観測方法の入力パラメータ。

 [ arthas @1 ]$ watch com .xx .actionlog .impl .ActionLogConfigApiImpl listTopics "{params,returnObj}" - x 2 - b
中止するにはQ またはCtrl + C を押します
影響クラス1メソッド1 )、 コスト 209 ミリ秒リスナーID7
メソッド= com .xx .actionlog .impl .ActionLogConfigApiImpl .listTopics 場所= AtEnter
ts = 2021 -05 -21 14 : 55 : 34 ; [ コスト= 0.054197ms ] 結果= @ArrayList [
@物体[][
@文字列[ K8SOFFICE ],
@String [ デフォルト],
],
ヌル
]

メソッドが呼び出される前とメソッドが返された後を同時に観察します。

 [ arthas @1 ]$ watch com .xx .actionlog .impl .ActionLogConfigApiImpl listTopics "{params,target,returnObj}" - x 2 - b - s - n 2
中止するにはQ またはCtrl + C を押します
影響クラス1メソッド1コスト: 190 ミリリスナーID8
メソッド= com .xx .actionlog .impl .ActionLogConfigApiImpl .listTopics 場所= AtEnter
ts = 2021 -05 -21 14 : 57 : 18 ; [ コスト= 0.035688ms ] 結果= @ArrayList [
@物体[][
@文字列[ K8SOFFICE ],
@String [ デフォルト],
],
@ActionLogConfigApiImpl [
ログ= @Logger [ Logger [ com .xx .actionlog .impl .ActionLogConfigApiImpl ]],
DEFAULT_CLUSTER = @String [ デフォルト],
DEFAULT_NAMESPACE = @String [ アプリケーション],
DEFAULT_ACTION_LOG_NAMESPACE = @String [ actionLogConfig ],
apolloOperationService = @ApolloOperationService [ com .xx .actionlog .service .ApolloOperationService @9470ab3 ],
$ jacocoData = @boolean [][ isEmpty = false ; サイズ= 91 ],
],
ヌル
]
メソッド= com .xx .actionlog .impl .ActionLogConfigApiImpl .listTopics 場所= AtExit
ts = 2021 -05 -21 14 : 57 : 18 ; [ コスト= 1.4527299465320627E10ms ] 結果= @ArrayList [
@物体[][
@文字列[ K8SOFFICE ],
@String [ デフォルト],
],
@ActionLogConfigApiImpl [
ログ= @Logger [ Logger [ com .xx .actionlog .impl .ActionLogConfigApiImpl ]],
DEFAULT_CLUSTER = @String [ デフォルト],
DEFAULT_NAMESPACE = @String [ アプリケーション],
DEFAULT_ACTION_LOG_NAMESPACE = @String [ actionLogConfig ],
apolloOperationService = @ApolloOperationService [ com .xx .actionlog .service .ApolloOperationService @9470ab3 ],
$ jacocoData = @boolean [][ isEmpty = false ; サイズ= 91 ],
],
@配列リスト[
@String [ 注文],
@String [ 注文ログ],
@String [ 操作ログ],
@String [ ストア],
@String [ ストア],
@String [ 場所],
@String [ タグ],
@String [ チャンネル],
@String [ サプライヤー],
@String [ 認証],
@String [ サイト],
],
]
コマンド実行回数が制限回数2回) 超えたため、 コマンドは終了します - n オプション設定できます

(4)scコマンド

Search-Class は Search Class の略語で、JVM によってロードされたクラスに関する情報を表示するために使用されます。

共通パラメータ:

  • -dパラメータは、クラス関連の詳細情報 (完全修飾クラス名、ストレージ パス、インターフェイス、アノテーション、継承された親クラス、クラス ローダーなど) を出力するために使用され、あいまい検索をサポートします。
  • 上記のクラス情報に権限、タイプ、名前などのフィールド情報を追加するには、 -fパラメータを -d コマンドと組み合わせて使用​​する必要があります。
 sc - d - f * TableInfoServiceImpl 
 [ arthas @1 ]$ sc - d - f * TableInfoServiceImpl
クラス情報com.xx.consumer.actionlog.service.impl.TableInfoServiceImpl
コードソースファイル: /app/action-log-consumer.jar ! / BOOT - INF / classes ! /
名前com .xx .consumer .actionlog .service .impl .TableInfoServiceImpl
isInterface がfalse
isAnnotation がfalse
isEnum がfalse
isAnonymousClass がfalse
isArray がfalse
isLocalClass がfalse
isMemberClass がfalse
isPrimitive がfalse
isSynthetic がfalse
単純な名前のTableInfoServiceImpl
修飾子public
アノテーションorg .springframework .stereotype .Service
インターフェースcom .xx .consumer .actionlog .service .TableInfoService
スーパークラス+- java .lang .Object
クラスローダー+- org .springframework .boot .loader .LaunchedURLClassLoader @7fad8c79
+- sun .misc .Launcher $ AppClassLoader @18b4aac2
+- sun .misc .Launcher $ ExtClassLoader @63c4310c
クラスローダーハッシュ7fad8c79
フィールドログ
タイプorg .slf4j .Logger
修飾子finalprivatestatic
ロガー[ com .xx .consumer .actionlog .service .impl .TableInfoServiceIm
pl ]

名前actionLogConfigProperties
タイプcom .xx .consumer .actionlog .properties .ActionLogConfigProperties
修飾子プライベート
アノテーションorg .springframework .beans .factory .annotation .Autowired

名前$ jacocoData
タイプ[]
修飾子privatestatictransient
[ Z @4494fa9e


影響( row-cnt : 1 ) は47 ミリ秒発生します

その他のパラメータ:

  • -E:正規表現の一致を有効にします。デフォルトはワイルドカードの一致です。
  • -c:クラス名式と一致します。

(5)smコマンド

Search-Method は Search-Method の略語で、ロードされたクラスのメソッド情報を表示するために使用されます。

共通パラメータ:

  • -d:メソッドの詳細。
 sm - d * ActionLogServiceImpl プロセス
 [ arthas @1 ]$ sm - d * ActionLogServiceImpl プロセス
宣言クラスcom .xx .consumer .actionlog .service .impl .ActionLogServiceImpl
メソッド名プロセス
修飾子public
注釈
パラメータjava.lang.String
void を返す
例外
クラスローダーハッシュ7fad8c79
影響( row-cnt : 1 ) コスト48 ミリ秒です

その他のパラメータ:

  • -E: 正規表現の一致を有効にします。デフォルトはワイルドカードの一致です。
  • -c: クラス名式を一致させます。

(6)jadコマンド

指定されたロードされたクラスのソース コードを逆コンパイルします。

 jad * テーブル情報サービス実装
 [ arthas @1 ]$ jad * TableInfoServiceImpl
クラスローダー:
+- org .springframework .boot .loader .LaunchedURLClassLoader @7fad8c79
+- sun .misc .Launcher $ AppClassLoader @18b4aac2
+- sun .misc .Launcher $ ExtClassLoader @63c4310c
位置
ファイル: /app/action-log-consumer.jar ! / BOOT-INF / classes ! /
/*
* CFR で逆コンパイルされています。
*
* 次のクラスを読み込めませんでした:
* com.xx.consumer.actionlog.properties.ActionLogConfigProperties
* com.xx.consumer.actionlog.properties.ActionLogConfigProperties$ActionLogConfigItem
* com.xx.consumer.actionlog.properties.AttentionFieldConfig
* com.xx.consumer.actionlog.service.TableInfoService
* org.slf4j.ロガー
* org.slf4j.LoggerFactory
* org.springframework.beans.factory.annotation.Autowired
* org.springframework.stereotype.Service
/
パッケージcom .xx .consumer .actionlog .service .impl ;

com .xx .consumer .actionlog .properties .ActionLogConfigProperties をインポートします
com .xx .consumer .actionlog .properties .AttentionFieldConfig をインポートします
com .xx .consumer .actionlog .service .TableInfoService をインポートします
org.slf4j.Logger をインポートします
org.slf4j.LoggerFactory インポートします
org.springframework.beans.factory.annotation.Autowired インポートます
org.springframework.stereotype.Service インポートします
@サービス
パブリッククラスTableInfoServiceImpl
TableInfoService を実装します{
プライベート静的最終ロガーログ;
@オートワイヤード
プライベートActionLogConfigProperties actionLogConfigProperties ;
private static transient /* 合成 */ boolean [] $ jacocoData ;
public TableInfoServiceImpl () {
ブール値[] blArray = TableInfoServiceImpl$jacocoInit ();
blArray [ 0 ] = true ;
}
/*
* 警告 - 無効な宣言
/
パブリック文字列getColumnCommentByTableNameAndColumnName ( 文字列文字文字列文字列2 ) {
文字列の説明;
列名を空にします
ブール値[] blArray = TableInfoServiceImpl$jacocoInit ();
/*18*/ void var4_4 = 列名;
試す{
テーブル名が空です;
blArray [ 1 ] = true ;
/*20*/ desc = (( AttentionFieldConfig )(( ActionLogConfigProperties .ActionLogConfigItem ) this.actionLogConfigProperties.getConfig () .get ( tableName )) .getAttentionFields () .get ( columnName )) .getDesc ();
/*23*/ blArray [ 2 ] = true ;
}
catch ( 例外例外) {
void e ;
blArray [ 3 ] = true ;
/*22*/ log.warn ( e.getMessage (), ( Throwable ) e );
blArray [ 4 ] = true ;
}
blArray [ 5 ] = true ;
説明を返します
}
静的{
ブール値[] blArray = TableInfoServiceImpl$jacocoInit ();
/*10*/ ログ= LoggerFactory.getLogger ( TableInfoServiceImpl .class );
blArray [ 6 ] = true ;
}
プライベート静的/* 合成 */ ブール値[] $jacocoInit () {
ブール値[] blArray = $ jacocoData ;
$ jacocoData == null場合
オブジェクト[] objectArray = 新しいオブジェクト[]{ 883735039782912886L , "com/xx/consumer/actionlog/service/impl/TableInfoServiceImpl" , 7 };
不明なエラー$jacocoAccess.equals ( objectArray );
blArray = $ jacocoData = ( ブール値[] ) オブジェクト配列[ 0 ];
}
blArray を返します
}
}
影響( row-cnt : 1 ) は253 ミリ秒発生します

(7) JVMコマンド

ロードされたクラスへのパス、起動クラスパス、ロードされたクラスの数など、JVM 関連の情報を出力します。

(8)トレースコマンド

メソッドの内部呼び出しパスと、メソッドパス上の各ノードで消費された時間が表示されます。これは、インターフェースのパフォーマンスのローカライズと最適化に使用されます。

共通パラメータ:

  • -n:リクエスト数が多すぎて、リクエストごとに呼び出し時間をかけたくない場合があります。その場合、このパラメータを使用して、終了するまでの呼び出し回数を指定できます。
 トレース* ActionLogConfigApiImpl listTopics - n 2 
 [ arthas @1 ]$ トレース* ActionLogConfigApiImpl listTopics - n 2
中止するにはQ またはCtrl + C を押します
影響クラス1メソッド1コスト 237 ミリ秒リスナーID3
` ---ts = 2021-05-21 14:22:43 ; thread_name = http-nio-8047-exec-5 ; id = 59 ; is_daemon = true ; 優先度= 5 ; TCCL = org .springframework .boot .loader .LaunchedURLClassLoader @ 7fad8c79
` --- [ 158.020381ms ] com .xx .actionlog .impl .ActionLogConfigApiImpl : listTopics ()
+ --- [ 0.063066ms ] com .xx .actionlog .impl .ActionLogConfigApiImpl : $jacocoInit () #25
+ --- [ 0.035828ms ] com .xx .utils .StringUtils : isEmpty () #108
+ --- [ 0.02172ms ] com .xx .utils .StringUtils : isEmpty () #114
` --- [ 157.534007ms ] com .xx .actionlog .service .ApolloOperationService : listKafkaTopics () #117

` ---ts = 2021-05-21 14:22:51 ; thread_name = http-nio-8047-exec-9 ; id = 5d ; is_daemon = true ; 優先度= 5 ; TCCL = org .springframework .boot .loader .LaunchedURLClassLoader @7fad8c79
` --- [ 173.617716ms ] com .xx .actionlog .impl .ActionLogConfigApiImpl : listTopics ()
+ --- [ 0.025143ms ] com .xx .actionlog .impl .ActionLogConfigApiImpl : $jacocoInit () #25
+ --- [ 0.023677ms ] com .xx .utils .StringUtils : isEmpty () #108
+ --- [ 0.017739ms ] com .xx .utils .StringUtils : isEmpty () #114
` --- [ 173.398065ms ] com .xx .actionlog .service .ApolloOperationService : listKafkaTopics () #117

コマンド実行回数が制限回数2回) 超えたため、 コマンドは終了します - n オプション設定できます

(9)スタックコマンド

現在のメソッドの呼び出しパスを出力します。このコマンドは、現在のメソッドが異なるパスを呼び出す可能性がある場合に、呼び出しチェーンをトレースするために使用できます。

共通パラメータ:

  • -n:終了回数を指定します。指定回数に達すると、プログラムは自動的に終了し、リスニングを停止します。
 スタック* ActionLogConfigApiImpl listTopics - n 1

`ActionLogConfigApiImpl` クラスの `listTopics` メソッドの呼び出しチェーンを調べます。

 [ arthas @1 ]$ スタック* ActionLogConfigApiImpl listTopics - n 1
中止するにはQ またはCtrl + C を押します
影響クラス1メソッド1コスト545 ミリ秒 リスナーID1
ts = 2021-05-21 13:51:59 ; thread_name = http-nio-8047-exec-2 ; id = 56 ; is_daemon = true ; 優先度= 5 ; TCCL = org .springframework .boot .loader .LaunchedURLClassLoader @7fad8c79
@com .xx .actionlog .impl .ActionLogConfigApiImpl .listTopics ()
org.apache.dubbo.common.bytecode.Wrapper3.invokeMethod ( Wrapper3 .java : -1 )
org .apache .dubbo .rpc .proxy .javassist .JavassistProxyFactory $ 1.doInvoke ( JavassistProxyFactory .java : 47 )
org.apache.dubbo.rpc.proxy.AbstractProxyInvoker.invoke ( AbstractProxyInvoker .java : 84 )
com.xx.apache.dubbo.filter.xxExceptionFilter.invoke ( xxExceptionFilter .java : 53 )
org .apache .dubbo .rpc .protocol .ProtocolFilterWrapper $1.invoke ( ProtocolFilterWrapper .java : 81 )
org.apache.dubbo.monitor.support.MonitorFilter.invoke ( MonitorFilter .java : 89 )
org .apache .dubbo .rpc .protocol .ProtocolFilterWrapper $1.invoke ( ProtocolFilterWrapper .java : 81 )
com .alibaba .dubbo .rpc .Invoker $CompatibleInvoker.invoke ( Invoker .java : 55 )
com.xx.zipkin.dubbo.ZipkinDubboFilter.invoke ( ZipkinDubboFilter .java : 84 )
com.alibaba.dubbo.rpc.Filter.invoke ( フィルター.java : 29 )
org .apache .dubbo .rpc .protocol .ProtocolFilterWrapper $1.invoke ( ProtocolFilterWrapper .java : 81 )
org.apache.dubbo.rpc.filter.TimeoutFilter.invoke ( TimeoutFilter .java : 44 )
org .apache .dubbo .rpc .protocol .ProtocolFilterWrapper $1.invoke ( ProtocolFilterWrapper .java : 81 )
org.apache.dubbo.rpc.protocol.dubbo.filter.TraceFilter.invoke ( TraceFilter .java : 77 )
org .apache .dubbo .rpc .protocol .ProtocolFilterWrapper $1.invoke ( ProtocolFilterWrapper .java : 81 )
org.apache.dubbo.rpc.filter.ExecuteLimitFilter.invoke ( ExecuteLimitFilter .java : 56 )
org .apache .dubbo .rpc .protocol .ProtocolFilterWrapper $1.invoke ( ProtocolFilterWrapper .java : 81 )
org.apache.dubbo.rpc.filter.ContextFilter.invoke ( ContextFilter .java : 118 )
org .apache .dubbo .rpc .protocol .ProtocolFilterWrapper $1.invoke ( ProtocolFilterWrapper .java : 81 )
org.apache.dubbo.rpc.filter.GenericFilter.invoke ( GenericFilter .java : 152 )
org .apache .dubbo .rpc .protocol .ProtocolFilterWrapper $1.invoke ( ProtocolFilterWrapper .java : 81 )
org.apache.dubbo.rpc.filter.ClassLoaderFilter.invoke ( ClassLoaderFilter .java : 38 )
org .apache .dubbo .rpc .protocol .ProtocolFilterWrapper $1.invoke ( ProtocolFilterWrapper .java : 81 )
org.apache.dubbo.rpc.filter.EchoFilter.invoke ( EchoFilter .java : 41 )
org .apache .dubbo .rpc .protocol .ProtocolFilterWrapper $1.invoke ( ProtocolFilterWrapper .java : 81 )
org.apache.dubbo.rpc.protocol.injvm.InjvmInvoker.doInvoke ( InjvmInvoker .java : 63 )
org.apache.dubbo.rpc.protocol.AbstractInvoker.invoke ( AbstractInvoker .java : 162 )
org.apache.dubbo.rpc.protocol.AsyncToSyncInvoker.invoke ( AsyncToSyncInvoker .java : 52 )
org.apache.dubbo.monitor.support.MonitorFilter.invoke ( MonitorFilter .java : 89 )
org .apache .dubbo .rpc .protocol .ProtocolFilterWrapper $ 1.in
ボーク( ProtocolFilterWrapper.java:81 )
com .alibaba .dubbo .rpc .Invoker $CompatibleInvoker.invoke ( Invoker .java : 55 )
com.xx.zipkin.dubbo.ZipkinDubboFilter.invoke ( ZipkinDubboFilter .java : 84 )
...
org.springframework.web.filter.OncePerRequestFilter.doFilter ( OncePerRequestFilter .java : 107 )
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter ( ApplicationFilterChain .java : 193 )
org.apache.catalina.core.ApplicationFilterChain.doFilter ( ApplicationFilterChain .java : 166 )
org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal ( HttpPutFormContentFilter .java : 109 )
org.springframework.web.filter.OncePerRequestFilter.doFilter ( OncePerRequestFilter .java : 107 )
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter ( ApplicationFilterChain .java : 193 )
org.apache.catalina.core.ApplicationFilterChain.doFilter ( ApplicationFilterChain .java : 166 )
org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal ( HiddenHttpMethodFilter .java : 93 )
org.springframework.web.filter.OncePerRequestFilter.doFilter ( OncePerRequestFilter .java : 107 )
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter ( ApplicationFilterChain .java : 193 )
org.apache.catalina.core.ApplicationFilterChain.doFilter ( ApplicationFilterChain .java : 166 )
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal ( CharacterEncodingFilter .java : 197 )
org.springframework.web.filter.OncePerRequestFilter.doFilter ( OncePerRequestFilter .java : 107 )
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter ( ApplicationFilterChain .java : 193 )
org.apache.catalina.core.ApplicationFilterChain.doFilter ( ApplicationFilterChain .java : 166 )
org.springframework.boot.actuate.autoconfigure.MetricsFilter.doFilterInternal ( MetricsFilter .java : 100 )
org.springframework.web.filter.OncePerRequestFilter.doFilter ( OncePerRequestFilter .java : 107 )
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter ( ApplicationFilterChain .java : 193 )
org.apache.catalina.core.ApplicationFilterChain.doFilter ( ApplicationFilterChain .java : 166 )
com.xx.web.filters.SimpleCORSFilter.doFilter ( SimpleCORSFilter .java : 38 )
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter ( ApplicationFilterChain .java : 193 )
org.apache.catalina.core.ApplicationFilterChain.doFilter ( ApplicationFilterChain .java : 166 )
org.apache.catalina.core.StandardWrapperValve.invoke ( StandardWrapperValve .java : 199 )
org.apache.catalina.core.StandardContextValve.invoke ( StandardContextValve .java : 96 )
org.apache.catalina.authenticator.AuthenticatorBase.invoke ( AuthenticatorBase .java : 493 )
org.apache.catalina.core.StandardHostValve.invoke ( StandardHostValve .java : 137 )
org.apache.catalina.valves.ErrorReportValve.invoke ( ErrorReportValve .java : 81 )
org.apache.catalina.core.StandardEngineValve.invoke ( StandardEngineValve .java : 87 )
org.apache.catalina.valves.RemoteIpValve.invoke ( RemoteIpValve .java : 679 )
org.apache.catalina.connector.CoyoteAdapter.service ( CoyoteAdapter .java : 343 )
org.apache.coyote.http11.Http11Processor.service ( Http11Processor .java : 798 )
org.apache.coyote.AbstractProcessorLight.process ( AbstractProcessorLight .java : 66 )
org .apache .coyote .AbstractProtocol $ConnectionHandler.process ( AbstractProtocol .java : 808 )
org .apache .tomcat .util .net .NioEndpoint $ SocketProcessor.doRun ( NioEndpoint .java : 1498 )
org.apache.tomcat.util.net.SocketProcessorBase.run ( SocketProcessorBase .java : 49 )
java.util.concurrent.ThreadPoolExecutor.runWorker ( ThreadPoolExecutor .java : 1149 )
java .util .concurrent .ThreadPoolExecutor $Worker.run ( ThreadPoolExecutor .java : 624 )
org .apache .tomcat .util .threads .TaskThread $ WrappingRunnable.run ( TaskThread .java : 61 )
java.lang.Thread.run ( スレッド.java : 748 )
コマンド実行回数が制限回数1回) 超えたため、 コマンドは終了します - n オプション設定できます

(10)スタックコマンド

OGNL 式を実行します。

静的関数を呼び出します。

 $ ognl '@[email protected]("hello")'
ヌル

静的変数の値を表示するには (ハッシュコードは変更されるため、まず現在の ClassLoader 情報を確認し、対応する ClassLoader のハッシュコードを抽出する必要があります)。

ハッシュコードで ClassLoader を指定します。

 [ arthas @1 ]$ クラスローダー- t
+- ブートストラップクラスローダー
+- sun .misc .Launcher $ ExtClassLoader @7611dd8b
+- com .taobao .arthas .agent .ArthasClassloader @17e023f0
+- sun .misc .Launcher $ AppClassLoader @18b4aac2
+- org .springframework .boot .loader .LaunchedURLClassLoader @7fad8c79
+- com .alibaba .fastjson .util .ASMClassLoader @4be7162b
+- Tomcat組み込みWebアプリクラスローダー
コンテキスト: ROOT
委任: true
---------- > クラスローダー:
org .springframework .boot .loader .LaunchedURLClassLoader @7fad8c79

影響( row-cnt : 7 ) は23 ミリ秒発生します
  • -c:式を実行するClassLoaderのハッシュコード。デフォルト値はSystemClassLoaderです。
 [ arthas @1 ]$ ognl - c 7fad8c79 '@com.xx.actionlog.impl.ActionLogConfigApiImpl@DEFAULT_CLUSTER'
@String [ デフォルト]