JVMのメモリ管理に関する質問があります(少なくともSUNのものでは)。OSにメモリを返すJVM
JVMが未使用のメモリをOS(私の場合はウィンドウ)に送り返すという事実を制御する方法を知りたいと思います。
私は、私が期待していることを説明するための簡単なJavaプログラムを作成しました。 -Dcom.sun.management.jmxremoteオプションを付けて実行すると、jconsoleなどでヒープを監視することもできます。以下のプログラムで
:
package fr.brouillard.jvm;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.List;
public class MemoryFree {
private BufferedReader reader = new BufferedReader(new
InputStreamReader(System.in));
private List<byte[]> usedMemory = new LinkedList<byte[]>();
private int totalMB = 0;
private int gcTimes = 0;
public void allocate(int howManyMB) {
usedMemory.add(new byte[howManyMB * 1024 * 1024]);
totalMB += howManyMB;
System.out.println(howManyMB + "MB allocated, total allocated: " +
totalMB + "MB");
}
public void free() {
usedMemory.clear();
}
public void gc() {
System.gc();
System.out.println("GC " + (++gcTimes) + " times");
}
public void waitAnswer(String msg) {
System.out.println("Press [enter]" + ((msg==null)?"":msg));
try {
reader.readLine();
} catch (IOException e) {
}
}
public static void main(String[] args) {
MemoryFree mf = new MemoryFree();
mf.waitAnswer(" to allocate memory");
mf.allocate(20);
mf.allocate(10);
mf.allocate(15);
mf.waitAnswer(" to free memory");
mf.free();
mf.waitAnswer(" to GC");
mf.gc();
mf.waitAnswer(" to GC");
mf.gc();
mf.waitAnswer(" to GC");
mf.gc();
mf.waitAnswer(" to GC");
mf.gc();
mf.waitAnswer(" to exit the program");
try {
mf.reader.close();
} catch (IOException e) {}
}
}
最初のGCが(期待されているもの)で行われているが、メモリが唯一の第三GCから始まるOSに返送された後、内部ヒープは無料です。 4番目以降は、割り当てられた全メモリがOSに返されます。
この動作を制御するためにJVMを設定するにはどうすればよいですか? 実際に私の問題は、サーバー上でいくつかのCITRIXクライアントセッションを実行する必要があることですが、サーバー上の実行中のJVMができるだけ早くメモリを解放したいと思っています(私のアプリケーションでは、 。
この動作を制御できない場合は、OS仮想メモリを増やし、OSの仮想メモリを増やして、OSに大きなパフォーマンス上の問題を起こさずにそのまま使用させることができますか? 例えば、十分な仮想メモリを持つ4GBサーバーには、1GBメモリの10個のJavaプロセス(ヒープ内に実際に割り当てられたオブジェクトが100MBのみ)を持つ問題があります。
他の人がすでにこのような質問/問題に直面していたと思います。
ありがとうございました。
タグが完全にあなたのコードを食べました –
Stackoverflowの構文強調機能を使用するために少しコードを再フォーマットしました。あなたが気にならないようにしてください。 –
ありがとう、私は正しく表示されませんでした。 私は不満はありません。私はちょうどここに新しいです;-) –