0

2 つのノード エージェントと 4 つのアプリケーション サーバーを備えた WebSphere 環境があります。トラフィックが多い場合、アプリケーション サーバーの 1 つが要求への応答を停止し、最大 Web コンテナー スレッド数にジャンプします。
スレッド ダンプを分析したところ、約 60% のスレッドが実行可能な状態にあり、20% が待機状態と保留状態にあることがわかりました。
スレッド ダンプにデッドロックの警告は表示されません。よく見ると、Web コンテナ スレッドの 1 つがロックを所有しており、次のメッセージが表示されていることがわかりました。

Owns Monitor Lock on com/ibm/ws/classloader/ExtJarClassLoader@0x0A00000000FA6F30

誰かが上記のエラーとその解決策を理解するのを手伝ってくれますか?

4

1 に答える 1

1

ロックを所有しているスレッドのスタック トレースを調べてから、そのロックを待機している他のすべてのスレッドのスタック トレースを調べることが重要です。ExtJarClassLoader の場合、ほぼ確実に、すべてのスレッドが loadClass 操作を実行しようとしていることを意味します。多くのスレッドがこれを試みてブロックされた場合、これは通常、実行中のコードが失敗したloadClass 操作を試行し、ClassNotFoundException をキャッチして続行していることを意味します。ClassNotFoundException の作成とスローはコストがかかるため、通常はコードを変更して全体的な結果をキャッシュする必要があります (たとえば、一連のクラス ロードを試行している場合は、肯定/否定の結果を何らかの方法でキャッシュする必要があります)。もちろん、loadClass を呼び出すコードがサードパーティのライブラリである場合、これは複雑になります。

于 2016-07-23T15:27:35.887 に答える