2011-01-02 12 views
1

私はいくつかの意思決定モジュールを通してファイルのバッチを処理するはずのJavaアプリケーションを実行しています。私は約50時間バッチを処理する必要があります。私が直面している問題は、プロセスが約1時間は正常に動作してからアイドル状態になることです。私はJVMを1時間実行してからシャットダウンし、30分後にJVMを再起動しますが、何らかの理由で2回目の実行にはほぼ4-5時間かかります。最初の試合が1時間で何をするかをする。助けや洞察力があれば大いに感謝します。jvm shutdown後もメモリが使用されています - どうすれば解放できますか?

私はこれを64ビットWindows r2サーバー、2つのIntelクアッドコアプロセッサー(2.53 GHz)、24 GB RAMで実行しています。 Javaバージョンは1.6.0_22(64ビット)で、アプリケーションに割り当てられるメモリは - ヒープ(16GB)とPermGen(2GB)です。

外部モジュールもjvmで動作していますが、シャットダウンしていますが、シャットダウン後もメモリに保持されているような気がします。私はjvmのRAM使用量を開始する前に1 GBです、それを終了した後、それは約3 GBに留まる傾向があります。そのメモリを強制的に解放するようにJAVAに依頼する方法はありますか?

+0

私はそれがJVMメモリを解放することを扱うOSだと思う。 putを使ってファイルIOをチェックしましたか?大量のファイルを書き込むため、アイドル状態になるか遅くなることがあります。ハードディスクの容量に大きな変化はありますか?外部モジュールの意味は?ナイーブな図書館?あなたのアプリケーションでマルチスレッドを使用していますか?おそらくスレッドロック? – gigadot

答えて

3

閉じるしようとしているJVMが本当に閉じていますか?

プロセスが終了すると、割り当てられたRAMはすべて割り当てられなくなります。一度プロセスを終了するとプロセスが停止することはありません。これは、プロセスが終了すると通知する方法がないことを意味します。これはオペレーティングシステムによって行われます。

JVMがまだ動作しているか、何か他のものがRAMを食べているようです。また、それを狩って殺すのではなく、悪質なバグを回避しようとしているようですね?

+0

はい、JVMはエラーなしで非常に優雅に終了しています。外部モジュールがJVMの範囲外であるネイティブヒープを使用しているような気がします。 (外部モジュールも同じJVM上で実行されます)。私がこれを言うのは、プロセスを開始する前のマシンのRAM使用量が1Gbであり、JVMを停止した後も長時間であっても約3GB(JVM実行時の使用量は約8GB)です。外部モジュールを変更せずにこのリソースを解放する方法はありますか? – user560174

+0

「ネイティブヒープ」はありません。プロセスのメモリ(JVMであろうとなかろうと)は、一度終了すると常に割り当てられません。 JVMの終了をどのように伝えることができますか?どのプロセスがメモリを消費しているのかわからないのですか?あなたはタスクマネージャーを見て、どのプロセスが実際にメモリを消費しているか、そしてjava.exe(またはjavaw.exe)プロセスがそこにないかどうか確認しましたか? – abyx

+0

はい、jvmがタスクマネージャを終了したときjava.exeまたはjavaw.exeがなくなりました – user560174

0

JVMがまったく終了していないと思われます。 OutOfMemoryExceptionsで停止するようなJBossインスタンスでは、この症状が定期的に発生します。 JVMを(SIGTERM/SIGQUITを介して)killすると、OOM例外を投げたり処理したりするすべてのリソースを消費しているので、JVMは適時に終了しません。

ログとプロセステーブルを慎重にチェックして、JVMが正常に終了するようにします。その時点で、OSはそのプロセスに関連するすべてのリソース(消費されたメモリを含む)をクリアします。

+0

はい、JVMはエラーなしで非常に優雅に終了しています。外部モジュールがJVMの範囲外のネイティブヒープを使用しているような気がします。 (外部モジュールも同じJVM上で実行されます)。私がこれを言うのは、プロセスを開始する前のマシンのRAM使用量が1Gbであり、JVMを停止した後も長時間であっても約3GB(JVM実行時の使用量は約8GB)です。外部モジュールを変更せずにこのリソースを解放する方法はありますか? – user560174

0

私はこのプロセスで何か気付いたことがあります。

私がJVMをシャットダウンした後、ファイルシステムに書き込んだファイルをすべて削除すると、RAMの使用率が元の1GBに戻ります。

これは何かにつながりますか、それについて私はおそらく何かできますか?

+0

OSによって提供される方法を使用してファイルを削除すると、コマンドラインまたはgui、それはOSのバグでなければなりません。これはそう思わない。たくさんのファイルを生成しましたか(10億)、ファイルを閉じることを忘れました。あなたのJavaアプリケーションまたはネイティブライブラリ内のIOストリームを閉じますか? – gigadot

+0

私は約100万のファイルに対してこれをやっていますが、私も閉じているのですが、なぜそれがメモリにぶら下がっているのか理解できません。 – user560174

0

参考情報:プロセスを分割して並列実行できるようにしましたか?

50時間の仕事は大きな仕事です!まともなマシン(8つのコアと24GBのRAM)があり、その一部を並列化できるはずです。

+0

それはマルチスレッドプロセスであり、2つのプロセスが実行されています。 – user560174

+0

また、このような4台のマシンがありますが、それでも50時間稼働する必要があります – user560174

+0

JVMをシャットダウンした後、ファイルシステムに書き込んだファイルをすべて削除すると、RAMの使用状況が再び表示されます元の1 GB。 これは何かにつながりますか、それについて私はおそらく何かできますか? – user560174

関連する問題