2012-06-21 26 views
6

非常に大量のメモリを必要とするEclipseのタスクでは、時々実行しています。タスクが実行されている間、jvmは約2-3GBのRAMをスワップします。しかし、いったんjvmがそのメモリを取ってしまえば、それをリリースせず、ヒープ内のメモリ使用量が約200MBで、ヒープサイズは約3GBとなり、他のプログラムがメモリを枯渇させているので、本当に不要です。強制的にjvmがネイティブメモリを返すようにする

私はMax/MinHeapFreeRatioパラメータを試して、jvmが未使用メモリの消費を減らすようにしました。それは私の日食config.iniファイルです:

-startup 
plugins/org.eclipse.equinox.launcher_1.2.0.v20110502.jar 
--launcher.library 
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.100.v20110502 
-vm 
c:/Program Files/Java/jdk1.6.0_26/bin/javaw.exe 
-showlocation 
-product 
org.eclipse.epp.package.jee.product 
--launcher.defaultAction 
openFile 
--launcher.XXMaxPermSize 
256M 
-showsplash 
org.eclipse.platform 
--launcher.XXMaxPermSize 
256m 
--launcher.defaultAction 
openFile 
-vmargs 
-Duser.name=Michael Nesterenko 
-Dosgi.requiredJavaVersion=1.5 
-Xms512m 
-Xmx4096m 
-XX:MinHeapFreeRatio=10 
-XX:MaxHeapFreeRatio=30 

しかし、それは未使用のメモリがたくさんあるとき、私はまだ状況を持って助けにはなりません。

+0

Eclipseを起動するための2つの異なるショートカット/シェルスクリプトを使用するのは現実的ですが、メモリ集約的なタスクを実行する必要があるときには、さまざまなパラメータセットが必要です。 –

答えて

4

仮想メモリとして起動すると、Javaは最大ヒープサイズを割り当てます。メモリを使用するので、実際のメインメモリとして割り当てられます。このサイズは縮小しません。このメモリを解放する唯一の方法は、プログラムを終了することです。

Javaはメモリ使用量を圧縮していますので、これまで使用していたページの多くをディスクにスワップすることができますが、再度必要な場合はパフォーマンスが大幅に低下する可能性があります。

+5

私は同意しません。メモリが縮小する可能性があります。このドキュメント(http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html)から: '-XX:MaxHeapFreeRatio = 70 \t縮小後のGC後の最大ヒープ・パーセンテージ。つまり、ヒープの70%以上が空いていると、ヒープは縮小します。また、このバグレポート(http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6498735)によると、 'HotSpot JVMは、ライブJavaオブジェクトに必要でない場合、すでにオペレーティングシステムにメモリを解放します。 –

+0

使用されるヒープは縮小されますが、アプリケーションの常駐サイズは縮小されません。 '私はバグの批評家が何について話しているのか分からない。私は、Virtual Memoryのフットプリントが縮小したことは決して見たことがありません。 ' –

+0

実際には仮想メモリは問題ではありません。それはプロセスプライベートなので、どのサイズでもかまいません。私はプロセスの作業セットを減らす必要があります - それは物理的なRAMの使用です。 –

0

このJavaバグ/ rfe-http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6498735に関する "stolsvik"のコメントの2番目の部分を読むことをお勧めします。と-XX:MaxHeapFreeRatioオプションがどのように機能するかを説明しています。

これで問題が解決しない場合は、GCを数回強制して、メモリが解放されるかどうか試してみてください。そして、GCロギングをオンにして、それが何かを明らかにするかどうかを確認します。


メモリ解放を妨げる可能性がある1つの問題は、JVMによる非ヒープメモリの割り当てです。例えばスレッドスタック、ネイティブコードヒープ、またはダイレクトマップバッファ用です。

関連する問題