Linux Mint で Java アプリを実行しています。毎分、プログラムは非常に顕著な速度低下を示します-一時停止。一時停止は一貫して 3 ~ 4 秒です。同じプログラムのインスタンスをさらに実行すると、1 分ごとに 3 ~ 4 秒一時停止します。各プログラムは、毎秒異なる秒で停止します。
最新の更新:
最後の更新 (以下) の後、スレッド プールのスレッド カウントを増やすと、GUI の問題が解消されました。約 40 時間実行した後、Jetty のHttpClient
ブロック-GET ( Request.send()
) 呼び出しでスレッド リークが発生しました。Executor クラスを使用して仕組みを説明すると、数分ごとにメイン スレッドが実行されます。Executor を使用して独立したスレッドを実行し、HTTP GET コマンドである Jetty のHttpClient.request.send()
.
約 40 時間の操作の後、プールで実行されているスレッドの数が急増しましたHttpClient
。したがって、40 時間、同じスレッドが正常に実行されました。作業仮説は、その頃、1 つまたは複数のsend()
呼び出しが完了またはタイムアウトせず、呼び出し元のスレッドに戻っていないというものです。基本的に、この/これらのスレッドは Jetty クライアント内でハングします。
jVisualMVで定期的な各サイクルを見ると、各サイクルの通常の動作が見られます。一部の HttpClient スレッドは、ホストの GET のために起動し、実行して、わずか数秒で終了します。また、モニターには、(現在) 10 時間HttpClient
「存在」している Jetty スレッド プールに属する約 10 のスレッドがあります。
基盤となるクライアントまたはネットワーク処理で何らかのエラーが発生したことが予想されます。タイムアウト例外やプログラミング例外がなかったことに驚いています。私が今尋ねることができるいくつかの明確な質問があります。
HttpClient
ハングアップする可能性のある内部で何が起こるかRequest.send()
- コール リターンのタイムアウトとは何ですか? 絶対的なタイムアウトやロックのチェックなどがまだあると思います(いいえ?)
- I/O システムがハングアップして、呼び出し側スレッドをハングアップさせたままにすることができますか? Java は素直に ...
- スケジュールされた時刻にマネージャー スレッドを起動し、次に
- 次に
Http.Request.send()
起こるのは、 - 次の送信のためのプール起動からの新しいスレッド (発生したように見えます)。
send()
前者が宙ぶらりんになっている間
- これらのスタック スレッドを制限したり、他の方法でクリーンアップしたりすることはできますか?
これは、スレッド プール サイズを増やす前に発生していました。何が起こったかというと、「責任」が問題領域により集中するようになったということです。HttpClient
また、同じ (特定されていない) 時間帯にApache で再びロックアップが発生したため、基になるシステムが疑わしいです。
(事前更新) ...
観察された一時停止動作は、JavaFX GUI が更新/更新されないことです。ディスプレイの時計 (textView)、setText()
フリーズ中に 1 秒あたり 2 回の x 更新で呼び出しがログに記録されました (これは新しい情報です)。時計は (Mint Linux では) 更新されませんが、Windows で実行している場合は引き続き更新されます。GC、ログ、プローブなどに関する質問を繰り返すのを未然に防ぐために、答えは同じです。現在、数週間にわたって広範な診断を実行しています。この問題は、間違いなく Linux JVM / Linux Mint / Threads (JavaFX による) の組み合わせです。その他の新しいデータとして、スレッドプールの数を +2 増やすと、フリーズが解消されるようです。これを確認して数値を調整するには、さらなるテストが必要です。質問ですが」"
Windows でプログラムのインスタンスを数日間、一時停止することなく実行しました。Mint Linux プラットフォームで実行するとフリーズが見られますが、これは非常に一貫しています。
プログラムには、スケジュールに従って実行される実行中のスレッドがいくつかあります。1 つのスレッドが http ソケットのインターネットを開きます。その領域をコメントアウトすると、一時停止が消えます。ただし、Windows を使用した場合、その動作は見られません。実験は、Mint ネットワーキング I/O サブシステム、Linux スケジューリング、Linux Java 8 JVM、またはこの 2 つの間の相互作用に固有のものを示しています。
ご想像のとおり、私たちはこれに髪を引き裂いています。たとえば、ロギングをオフにすると一時停止が残りました。ロギングを再開し、同じ秒カウントで 60 秒ごとに一時停止して、http サーバーへの呼び出しを 1 回実行しました。これは、他の処理を行わない場合でも発生します。さまざまな http ライブラリなどを試しました。JVM または Linux にあることは明らかです。
これを解決する方法を知っている人はいますか?