2012-08-12 16 views
6

私はSwings Javaアプリケーションを持っているとします。 ユーザーがアプリケーションを起動すると、最小ヒープは64MB、最大ヒープは2GB、 に設定されます。ログイン画面 が表示されます。 私のWindows 7から、私は、Javaアプリケーションがメモリリソースモニター(実際には、64MB以上のJVMはタスクのためにいくつかのメモリを必要とするので)からが割り当てられていることがわかります。実行時にOS用のJavaメモリを解放します。

ユーザーが非常に重い仕事をした後、アプリケーションは2Gを使用します。 ユーザーがアプリケーションをログアウトすると、ログイン画面が再び表示されます(アプリケーションはまだ閉じられていません)。現時点では、アプリケーション が64MBを使用している実際のメモリ(これは完璧なメモリ管理アプリケーションであると仮定します)、 ですが、このアプリケーションはまだ2GのRAMを使用していますが、OSのリソースモニタで見ることができます。

大容量のメモリを使用する必要がない場合は、アプリケーションがOSにメモリを解放します。私は実行時にJavaアプリケーションでそれを行うことはできますか?私のアプリケーションは、64MBのRAMを使用する必要があるとき

は私が意味する、 は、OSは64メガバイトのみ、 それは2GBのRAMが必要なときにそれを与え、それはOSがその後、64MBのRAMが必要になり、その後OSはそれを2ギガバイト、 を与えますそれは再び64MBを与えます、 私はそれを浪費したくありません2000MB - 64MB = 1936MB。

できますか?あなたがオブジェクトを処分し、ガーベジコレクタを提案できる

おかげで、

+1

この関連する質問をチェックしてください:http://stackoverflow.com/q/1481178/562906 – sinelaw

答えて

1

は、その作業を行うが、GCは、それが必要であると感じていない場合、要求は無視されます。要約すると、「いいえ」。

メモリがJavaアプリケーションに割り当てられていることに注意してください。アプリの前に設定されています。開始し、調節できません。

5

大きなメモリを使用する必要がないときに、アプリケーションがメモリをOSに解放したい場合があります。私は実行時にJavaアプリケーションでそれを行うことはできますか?

いいえできません。

状況によっては、GCがメモリを自らのOSに戻しますが、アプリケーションがGCにこれを行うように指示するJVMは認識していません。さらに、一般的なルールとして、JVMはより多くのメモリでより効率的に動作し、OSにメモリを継続的に要求/返却することは非効率的であるため、GCはこれを行うことについてかなり控えめです。


GCが戻ってメモリを与える前に、GCチューニングオプション-XX:MaxHeapFreeRatioがヒープを使用する自由の最大比率を指定するために使用できることに注意してください。しかし、合併症があります。たとえば、利用可能なすべてのGCがこのオプションを尊重するとは限りません。このアプローチを試してみるなら、あなたはいくつかの研究をすることを勧めます...そして奇跡を期待しないでください。

+1

それはGCの問題ですか?私はそうは思わない。 GCはオブジェクトをクリアしてヒープを解放しますが、ヒープを破棄することは他にあります。 –

+0

@AmirPashazadeh - JVMのソースコードを読んで、実際にメモリを返すコードがどこにあるかを知る必要があります。 –

+1

この設定は、singeThreadGCを使用している場合のみ考慮されます。私はこの答えを見つけました。このオプションを使用しているときに動作の変化を観察しなかった後、http://stackoverflow.com/a/8170123/775513 – cproinger

2

ホットスポットのserialgcは、メモリを元に戻します。あなたのパフォーマンスは、ダイビングにはなりません。

IBM J9 jvmのすべてのガベージコレクタがメモリを解放します。私はこのjvmが無料でダウンロードされているかどうかはわかりません...

最高の答えは、なぜあなたは心配ですか?最近はメモリーが汚れていて安いし、空きメモリーが無駄になります。これは本当ですか?は問題ですか?とにかくOSは余分な未使用メモリをディスクにページします。最善の答えは、それを無視することです。 :)

おそらくTeracotta/ehキャッシュの可能性があります。

EDIT:

私はちょうど小型のXmsおよびXmxの大規模でG1GCを使用して、ガベージコレクタが過剰オブジェクトが解放されたいくつかのガベージコレクション後のヒープのサイズを小さくすること、JDK1.7u6に気づきました。

+1

私のクライアントはそれを好まなかったので。 99%のケースでは、約300〜400MBのRAMを消費する仕事をしました。彼らはいくつかの重い仕事をした1%のケースがあり、アプリケーションは2GBのRAMを使用します。そして、彼らは、私のアプリケーションがそれをする必要がないときに、あまりにも多くのメモリを使用すると言いました。彼らは別のアプリのためのメモリが必要です。 Javaアプリケーションが最大メモリ使用量で実行されるたびに、使用する最小メモリ量で実行されたときにメモリがOSに返されないようです。 それは正しいですか? – user1592936

+1

更新を見て、私はいくつかの新しい情報を発見した... :)あなたのクライアントはとてもかわいいです、ごめんなさい。メモリを正しく管理するには、オペレーティングシステムに依存している必要があります。 –

+0

さて、Javaがメモリを正しく処理するように依頼するのは無理ではありません(そして私はこれをJava開発者として言います)。私は一般的に、現在必要とされているメモリを無制限に、または長期間にわたって5〜10倍に保つことは、マシン上で何も実行されていない限り、正しい動作であると一般には同意しません。 – nsandersen

5

私のテスト結果はover thereです。基本的に、MaxHeapFreeRatioはすべてのGC実装では尊重されていませんし、悪化させるためには適時にトリガするために十分なヒープアクティビティが必要であるようです。実際にメモリをOSにリリースするには2回フルGCを実行する必要があります。また、X GBのバーストメモリフットプリントがある場合は、ヒープのサイズを小さくするために、その量の1〜2倍を割り当てる必要があります。またはSystem.gc()を手動で呼び出します。パフォーマンスが問題ではなく、メモリフットプリントをカウントするすべての場合

、試してみてください。

-XX:UseSerialGC -Xms16M -Xminf=5 -Xmaxf=10 
+0

興味深いブログ。よくできました。しかし、あなたがどれくらいの時間待っているか知りたいです。例:ループとフープを実行してから1時間ほどアイドル状態になった後、JVMのメモリ消費量はどのように(OSから見て)どうなるでしょうか? 「アイドル」とは、メモリ割り当てアクティビティがないことを意味します。 – peterh

+0

AFAIK GCがメモリの変更によってトリガーされるため、待機するだけで何も行われません。自分で試してみてください。コードはそこにあります。 – user1050755

+0

興味深い投稿。ところで、OracleとIBM VMの場合、 'Xminf'と' Xmaxf'の値はパーセンテージ(0.0〜1.0)でなければならず、 '= 'の先頭はありません。 [here](https://docs.oracle.com/cd/E19683-01/806-7930/filestructure-8/index.html)、[here](http://www-01.ibm.com/)を参照してください。サポート/ knowledgecenter/SSYKE2_7.0.0/com.ibm.java.lnx.70.doc/diag/appendixes/cmdline/xmaxf.html)、[here](http://bugs.java.com/bugdatabase/view_bug)を参照してください。 do?bug_id = 8025661)。 – xav

0

は別のスレッドにあなたのコードの部分をフォーク試してみて、あなたはもうそれを必要としないときにそれを処分します。

+0

これはJavaのコンテキストではほとんど意味がありません。 (Javaスレッドを参照している場合は、OPが何をしようとしているのかを確認することはできません.JVMがヒープメモリをOSに戻すように納得させる必要があります)。 –

関連する問題