私はこれを読みました プロセスメモリVSヒープ-JVM と私は同じ問題を抱えています。
Jvmプロセスのメモリ使用量は増加し続け、縮小することはありません。Linuxサーバーでトップを実行して確認しました。アプリケーションはジョブをクラスターにスケジュールしています(Quartz + Sunを使用Java DRMAA API)
Javaヒープスペースはアプリケーションのライフサイクル中に制限内に留まっていますが、jvmプロセスはメモリ使用量が着実に上昇しており、決して低下することはありません。
これはメモリリークですか?もしそうなら、なぜヒープ領域が制限内にあるのですか?誰かがこれを説明できますか?.
UPDATE:私は-Xmx1600m -Xms1600mを持っています。jconsoleを追跡すると、ヒープスペースがこの制限内に十分にあることがわかりますが、一番上のコマンドはプロセスを示しています900m以上使用しています。
使用される仮想メモリの合計は、最大ヒープ+スレッドスタック+ダイレクトメモリ+ perm gen +共有ライブラリの合計です。これは決して縮小しません。
実際に使用されるメインメモリは、仮想メモリがどれだけ使用されているかによって異なります。共有ライブラリは共有されるため、複数のJVMを使用しても、このメモリが2倍になることはありません。
JVMがメモリをOSに解放することはありませんが、メインメモリが長期間使用されない場合は、必要に応じてスワップアウトできます。
実際のメモリ消費量は、Xmxなどで設定したものよりも多く、これは正常です。 「Javaは、各スレッドのスタックを含む他のものにメモリを割り当てます。VMの合計メモリ消費量が-Xmxの値を超えることも珍しくありません。」
パラメータ-Xmx1600m -Xms1600mは、最小で1600MBのメモリ、最大で1600MBのメモリを割り当てるようにJVMに指示します。したがって、JVMは起動時に1600MBを割り当て、決して解放しないようにする必要があります。
JVMがメモリをOSに解放するようにしたい場合は、-Xmsを低くする必要があります。おそらく、新しいG1ガベージコレクターでJava 1.7を使用する必要があります。stefankrause.net/wp /?p = 14。
Mac OS X 10.8およびJava 1.7を使用すると、システムの後にメモリがOSに解放されます。 .gc()が実行されます。
ヒープにJava仮想マシン(JVM)はJavaアプリケーションによって作成されたすべてのオブジェクトを、たとえば「新しい」演算子を使用して)格納します。Javaガベージコレクター(gc)は論理的にヒープを異なる領域に分離できるため、gcは削除される可能性のあるオブジェクトをより速く識別できます
新しいオブジェクトのメモリは、実行時にヒープに割り当てられます。インスタンス変数は、それらが宣言されているオブジェクト内にあります。
スタックは、メソッドの呼び出しとローカル変数が格納される場所です。メソッドが呼び出されると、そのスタックフレームが呼び出しスタックの一番上に置かれます。スタックフレームは、実行中のコード行やすべてのローカル変数の値など、メソッドの状態を保持します。スタックの一番上のメソッドは常に、そのスタックで現在実行されているメソッドです。スレッドには独自の呼び出しスタックがあります。
Java=オブジェクトはヒープ内に作成されます。プログラミング言語では、オブジェクトをスタックに生成するかどうかをプログラマーに決定させる可能性はありません。ただし、特定の場合スタック上のメモリ割り当てはヒープ内のメモリ割り当てよりも安価であり、スタック上の割り当て解除は解放され、スタックはランタイムによって効率的に管理されるため、オブジェクトをスタックに割り当てることが望ましい。
したがって、JVMは内部的にエスケープ分析を使用して、オブジェクトがスレッドまたはメソッドでのみ使用されているかどうかを確認します。 JVMがこれを識別した場合、スタック上にオブジェクトを作成することを決定し、Javaプログラムのパフォーマンスを向上させます。(http://www.ibm.com/developerworks/Java/library/j -nativememory-linux /)