序文Arthasを導入する前は、誰もが本番環境でJavaサービスに関する問題を経験したことがあるでしょう。最も一般的なシナリオは、サードパーティAPIの呼び出し時に例外が発生し、ログに記録されず、例外のスタックトレースでは問題の原因を特定できないというものです。このような状況では、必死に様々な方法を試すしかありませんが、根本的な解決策は見つかりません。Arthasを早期に導入することで、これらの問題を簡単に解決できるだけでなく、多くの一般的なリモートサービスの問題のトラブルシューティングと解決にも役立ちます。 アルサスArthasは、Alibabaが提供するオープンソースのJava診断ツールです。JDK 6以降、Linux/Mac/Windowsをサポートし、コマンドライン対話モードを採用しています。また、豊富なタブ自動補完機能も備えており、問題の特定と診断を容易にします。 オープンソースアドレス: https://github.com/alibaba/arthas。 公式ドキュメント: https://github.com/alibaba/arthas。 Arthas はどのような問題の解決に役立ちますか?- このクラスはどの JAR ファイルからロードされますか? クラス関連のさまざまな例外がスローされるのはなぜですか?
- 変更したコードが実行されないのはなぜでしょうか?コミットし忘れたのでしょうか?それともブランチが間違っているのでしょうか?
- オンラインでデバッグできない問題が発生した場合、ログを追加して再デプロイすることが唯一の解決策でしょうか?
- オンラインでユーザーのデータ処理に関する問題が発生しましたが、オンラインでデバッグしたり、オフラインで問題を再現したりできませんでした。
- システムの運用状態を総合的に把握できる視点はありますか?
- JVM のリアルタイム実行ステータスを監視するにはどのような方法がありますか?
- アプリケーションのホットスポットをすばやく見つけてフレーム グラフを生成するにはどうすればよいでしょうか?
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 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 ミリ秒、 リスナーID : 6 メソッド= 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 ミリ秒、 リスナーID : 7 メソッド= 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 ミリ秒、 リスナーID : 8 メソッド= 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 修飾子final 、 private 、 static 値ロガー[ com .xx .consumer .actionlog .service .impl .TableInfoServiceIm pl ]
名前actionLogConfigProperties タイプcom .xx .consumer .actionlog .properties .ActionLogConfigProperties 修飾子プライベート アノテーションorg .springframework .beans .factory .annotation .Autowired
名前$ jacocoData タイプ[] 修飾子private 、 static 、 transient 値[ Z @4494fa9e
影響( row-cnt : 1 ) は47 ミリ秒で発生します。 その他のパラメータ: - -E:正規表現の一致を有効にします。デフォルトはワイルドカードの一致です。
- -c:クラス名式と一致します。
(5)smコマンドSearch-Method は Search-Method の略語で、ロードされたクラスのメソッド情報を表示するために使用されます。 共通パラメータ: 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 ! /
パッケージ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 (); void var4_4 = 列名; 試す{ テーブル名が空です; blArray [ 1 ] = true ; desc = (( AttentionFieldConfig )(( ActionLogConfigProperties .ActionLogConfigItem ) this.actionLogConfigProperties.getConfig () .get ( tableName )) .getAttentionFields () .get ( columnName )) .getDesc (); blArray [ 2 ] = true ; } catch ( 例外例外) { void e ; blArray [ 3 ] = true ; log.warn ( e.getMessage (), ( Throwable ) e ); blArray [ 4 ] = true ; } blArray [ 5 ] = true ; 説明を返します。 } 静的{ ブール値[] blArray = TableInfoServiceImpl 。 $jacocoInit (); ログ= 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 ミリ秒、 リスナーID : 3 ` ---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 ミリ秒、 リスナーID : 1 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 [ デフォルト] |