7

Swings Javaアプリケーションがあるとします。最小ヒープを64MB、最大ヒープを2GBに設定します。ユーザーがアプリケーションを起動すると、ログイン画面が表示されます。このとき、アプリは64MBを使用します。私のWindows7から、JavaアプリケーションがOSのメモリリソースモニターから64MBに割り当てられていることがわかります(実際には、JVMはそのタスクのためにいくらかのメモリを必要とするため、64MBを超えています)。

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

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

つまり、アプリケーションで64MBのRAMを使用する必要がある場合、OSは64MBのみを提供し、2GBのRAMが必要な場合、OSは2GBを提供し、その後、64MBのRAMが必要であり、OSは再び64MBのみを提供します。 2000MB-64MB=1936MBを無駄にしたくない。

それをしてもいいですか?

ありがとう、

4

5 に答える 5

5

そこにテスト結果を投稿しました。基本的に、MaxHeapFreeRatioはすべてのGC実装で尊重されるわけではなく、さらに悪いことに、タイムリーにトリガーするために十分なヒープアクティビティが必要であるように思われます。OSにメモリを実際に解放するには、2回の完全なGC実行が必要な場合があります。また、バーストメモリフットプリントがX GBの場合、ヒープのダウンサイズをトリガーするには、おそらくその量の1倍または2倍を割り当てる必要があります。または、System.gc()を手動で呼び出します。

パフォーマンスが問題ではなく、メモリフットプリントが重要な場合は、次のことを試してください。

-XX:UseSerialGC -Xms16M -Xminf=5 -Xmaxf=10
于 2013-03-20T21:38:10.890 に答える
5

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

いいえ、できません。

状況によっては、GC がメモリを解放して OS に戻すことがありますが、アプリケーションが GC にこれを行うように指示できる JVM を私は知りません。それに加えて、GC はこれを行うことについてかなり保守的です。一般的なルールとして、JVM はより多くのメモリを使用するとより効率的に動作し、OS にメモリを継続的に要求/返還することは非効率的です。


GC チューニング オプション-XX:MaxHeapFreeRatioを使用して、GC がメモリを返す前に、空きヒープと使用済みヒープの最大比率を指定できることに注意してください。ただし、複雑な問題があります。たとえば、使用可能なすべての GC がこのオプションを尊重するわけではありません。このアプローチを試す場合は、調査を行うことをお勧めします...奇跡を期待しないでください.

于 2012-08-12T04:06:45.910 に答える
2

hotspot の serialgc はメモリを元に戻します...少なくとも以前はそうでした。あなたのパフォーマンスは急降下します。

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

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

オフヒープ ストレージ、おそらく Teracotta/eh キャッシュの Google を検討することもできます。

編集:

JDK1.7u6 で、小さな Xms と大きな Xmx で G1GC を使用すると、余分なオブジェクトが解放されたいくつかのガベージ コレクションの後に、ガベージ コレクターがヒープのサイズを縮小することに気付きました。

于 2012-08-12T04:14:40.453 に答える
1

オブジェクトを破棄して、ガベージコレクターにその作業を提案することはできますが、GCがそれが必要であると感じない場合、要求は無視されます。したがって、要約すると、「いいえ」です。

Javaアプリに割り当てられたメモリに注意してください。アプリの前に設定されます。開始し、調整できません。

于 2012-08-12T03:04:53.920 に答える
0

コードの一部を別のスレッドにフォークして、不要になったら破棄してください。

于 2013-08-05T17:54:00.637 に答える