問題タブ [thread-dump]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 高い CPU 使用率を最小限に抑えるために Java でスレッド ダンプを分析する方法
テキストファイルを読み込んでデータベースに挿入しようとしていますDisruptor
.
しかし、CPU 使用率が高すぎることがわかりました (top
コマンドによると 200%)。
パフォーマンス チューニングとスレッド ダンプ分析は初めてです。何が問題なのかわかりません。
そこでtop -H
、2 つの最も高いスレッド (両方とも 99%) を実行して見つけ、スレッド ダンプを見つけます。
基本的に、これら 2 つのスレッドはデータを Disruptor にパブリッシュします。私はこのように作成Disruptor
します:
スレッド ダンプを分析して、高い CPU 使用率の根本原因を見つけてください。
multithreading - Java スレッド ダンプ: 待機中 (オブジェクト モニター上) - 何を待機していますか?
java-thread-dump-waiting-on-object-monitor-line-not-followed-by-waiting-onという同様の質問がありましたが、具体的な回答がなかったので、もっと得たいと思って質問します情報...
次のスレッド ダンプでは、スレッドが "WAITING (on object monitor)" 状態にあることがわかりますが、何を待っているかを示す "waiting on " の行はありません。このスレッド スタックを解釈し、このスレッドが待機している理由 (およびどのリソース) を調べるにはどうすればよいですか?
このスレッドは、Tibco バスからのメッセージを受け入れるように構成されたリスナー スレッドの 1 つです。
ありがとう!
マリーナ
java - 詳細な分析のための Tomcat スレッド/ヒープ ダンプの自動化
Tomcat で Web アプリケーションを実行しています。大量のリクエストが発行されると、Tomcat プロセスがハングアップします。これは実稼働 Web アプリであるため、Tomcat Java プロセス/スレッド ダンプを手動で取得するために常に監視することはできません。
Tomcat で jmx リモート ポートを有効にしました
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=2222
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=true
私の質問は、Tomcat プロセスが高い CPU[スレッド数]/メモリ使用量/ハングした場合、その時点で、Tomcat スレッド ダンプを目的のディスクの場所に自動的に [コマンド ラインまたはプログラムで] 収集できますか?
java - RUNNABLE スレッドは、ネイティブ メソッドの場合に CPU を消費しないことがありますか?
ほとんどがアイドル状態の Tomcat サーバーのスレッドダンプを取得すると、多くのスレッドが次のように RUNNABLE 状態で表示される場合があります。
ソースコードの私の解釈は、このスレッドが HTTP キープアライブ接続からの追加データを (タイムアウトで) 待っているということです。そのため、スレッドが RUNNABLE であっても、CPU を消費しません。
Thread.State RUNNABLE javadocは次のように述べています。
実行可能状態のスレッドは Java 仮想マシンで実行されていますが、プロセッサなどのオペレーティング システムからの他のリソースを待機している可能性があります。
したがって、この場合、他のリソースは CPU ではなく I/O になります。
他の質問Java socketRead0 Issueで、ジェフは次のように答えています。
Java ネイティブ メソッドを使用している場合、呼び出しが実際に何らかのイベントを待ってブロックされていても、スタック トレースには RUNNABLE と表示されると思います。本質的に、ネイティブ メソッドが実際に何を行っているかを Java が知る方法はないと思います。そのため、Java はこれらの呼び出しに RUNNABLE のフラグを立てます。私は socketRead0() と socketAccept() でこれを見てきました - どちらも通常ブロックします。
私も同様の結論に達したので、この専用の質問でこの解釈を検証したいと思います。
RUNNABLE Threads を調べて CPU 消費を分析したい場合、ネイティブ メソッドのスレッドのソースコードを詳しく調べて除外する必要があるかもしれません。
要点は、スレッドの状態だけを見るほど簡単ではなく、ソースコードを掘り下げて、特定のネイティブ メソッドが何をしているのかを推測する必要があることです (または、その C または C++ ソースコードを調べることさえあります)。
java - JVMTI を使用して定期的な Java スレッド ダンプを生成する方法はありますか?
Java でスレッド ダンプを生成する方法は複数あります。
実行中の JVM に対するパフォーマンスの影響を評価するために、JVMTI (C API) を使用して生成したいと考えています。(私は jstack と JMX を認識しています。この質問は一般にスレッド ダンプの取得に関するものではなく、JVMTI API の使用に関するものです)。
このブログ投稿からコードを作成しています。そこでは、Java エージェントが SIGQUIT シグナルにアタッチされます。これは、JVM がスレッド ダンプを stdout に書き込むために使用する信号と同じであるため、避けたいと思います。その二面性は避けたい。
つまり、別のシグナルにアタッチするか、エージェントが定期的にスレッド ダンプを生成する方法を見つけたいと考えています。