2

Java プロセスを実行しているときに、Linux (64 ビット) への最近の顧客の移行に問題があります。

このプロセスは、ほとんどが futex の識別子を持つ何千ものスレッドを生成しています。私は futex (高速ユーザー空間ミューテックス) を調べましたが、これは基本的なロックを実装するための Linux 構造です。

コードは最近、BlockingQueue と ExecutorService を実装して子スレッドを生成するように変更されましたが、子スレッドの数は構成設定によって制御されており、この特定のメカニズムが暴走していないことを証明できます。BlockingQueue といくつかのロックのために、JVM 内部の何かがこれらすべてのスレッドを生成しているとしか思えませんか?

それで、これらのスレッドが実際に何であるかを知る方法と、それらを制御/停止するために私ができることを誰か教えてもらえますか?

以下は、プロセス リストの数行です。プロセスを強制終了する前の実際のリストは、13000 行を超えていました。

0 - 54321 447 446 1 - - - 5953085 - ? 00:15:50 Java
0 S 54321 - - 0 82 2 - - futex_ - 00:00:00 -
1 S 54321 - - 0 82 2 - - futex_ - 00:00:00 -
1 S 54321 - - 0 82 2 - - futex_ - 00:00:00 -
1 S 54321 - - 0 82 2 - - futex_ - 00:00:00 -
1 S 54321 - - 0 82 2 - - futex_ - 00:00:00 -
1 S 54321 - - 0 82 2 - - futex_ - 00:00:00 -
1 S 54321 - - 0 82 2 - - futex_ - 00:00:00 -
1 S 54321 - - 0 82 2 - - futex_ - 00:00:00 -

どんな提案もありがたく受け入れました。

4

1 に答える 1

0

IDE のデバッガーでアプリケーションを読み込めない場合は、アプリケーションを VisualVM で読み込んで、スレッドが実際に何をしているかを確認することをお勧めします。

http://download.oracle.com/javase/6/docs/technotes/guides/visualvm/threads.html

スレッド数が多いためにリソースが不足する可能性があるため、アプリを強制終了できることを確認してください (つまり、Linux では、シェルを用意してください)。

于 2011-05-01T01:17:16.097 に答える