5

私の質問は、JVMは、スレッドまたはプロセスに関連するある種のリソースを共有しており、通常の使用で1か月以上経過するとProcessBuilderのパフォーマンスが急上昇する可能性があるということです。すべてのアプリにjava6update21を使用します。

過去数か月の間に、データセンター内の単一のサーバー(Solaris10を実行しているSparcM4000)は、問題なく約6〜8週間稼働できることに気付きました。ただし、すぐに、ProcessBuilderクラスを使用してスクリプトを実行するアプリケーションのパフォーマンスは、パフォーマンスに大きな打撃を与えます。ProcessBuilder.startが戻るまでに1分以上かかる場合があります。再起動後、およびその後数週間、通常の戻り時間は10秒またはおそらく100ミリ秒の範囲です。

5つのスレッドを作成する個別の小さなアプリケーションを作成し、各スレッドはProcessBuilderを使用して「ls」コマンドを10回連続して実行し、元の問題を監視するためにそこから統計を収集します。このアプリケーションは実行のたびに終了し、cronから1時間に1回だけ実行されます。通常、1〜2秒しかかかりません。

昨夜、45日間の稼働時間と通常の動作の後、ProcessBuilderの時間はProcessBuilder.startの呼び出しごとに1分以上に急上昇しました。

上はメモリやCPUの占有を示していません。テストアプリでjstackを実行しようとしましたが、「スレッド_dbエージェントを作成できません」というエラーが発生しました。

何か案は?

4

1 に答える 1

4

Linuxで実行されるアプリケーションでも同様の問題が発生しました。Linux JVMコードはフォークを使用します。これは、実行するたびにアドレス空間がマップおよびコピーされることを意味します。私たちは多くの小さな短期間のプロセスを実行していました。あなたのアプリとの主な違いは、ヒープが比較的大きい(約240GB)ので、それが影響を与えたと確信していることです。最終的に、JNIとposixspawnを使用して独自のスポーンコードを実装しました。質問/回答へのリンクは次のとおりです。Javaでのプロセス作成の速度低下

于 2011-02-04T02:43:30.523 に答える