私は、Javaでサンプルプログラムデモのメモリリークを構築します。メモリリークですか?
public class MemoryLeakTest {
static int depth = 0;
int number=0;
MemoryLeakTest mobj;
MemoryLeakTest(){
number = depth;
if(depth < 6500){
depth++;
mobj = new MemoryLeakTest();
}
}
protected void finalize(){
System.out.println(number + " released.");
}
public static void main(String[] args) {
try{
System.out.println(ManagementFactory.getMemoryMXBean().getHeapMemoryUsage());
System.out.println("Free Memory in starting "+ Runtime.getRuntime().freeMemory());
MemoryLeakTest testObj = new MemoryLeakTest();
System.out.println("Free Memory in end "+ Runtime.getRuntime().freeMemory());
System.out.println(ManagementFactory.getMemoryMXBean().getHeapMemoryUsage());
}
catch(Exception exp){}
finally{
System.out.println("Free Memory"+ Runtime.getRuntime().freeMemory());
System.out.println(ManagementFactory.getMemoryMXBean().getHeapMemoryUsage());
}
}
}
if(depth < N)
のNの値を変更して実行します。ここに結果があります。
深さが1000
エンド15964120に15964120 空きメモリを起動中= 16252928(15872K)MAX = 259522560(253440K) 無料コミットメモリのinit = 16777216(16384K)を使用= 288808(282K)であります 初期= 16777216(16384K)使用= 288808(282K)コミット= 16252928(15872K)最大= 259522560(253440K) 空きメモリ15964120 init = 16777216(16384K)= 288808(282K)コミット= 16252928(15872K)max = 259522560(253440K)
深さは1500
のinit = 16777216(16384K)のinit = 16777216エンド15964120 に15964120 空きメモリを起動中= 16252928(15872K)MAX = 259522560(253440K) 空きメモリを犯し= 288808(282K)が使用されています(16384K)使用= 379400(370K)コミット= 16252928(15872K)最大= 259522560(253440K)使用済み= 288808(282K)コミット済み= 16252928(15872K)最大= 259522560(253440K) 空きメモリ15873528 初期= 16777216
深さが6000の場合
使用のinit = 16777216(16384K)= 288808最後に15964120 空きメモリを開始するに= 16252928(15872K)MAX = 259522560(253440K) 無料コミットメモリ(282K)15692784 のinit = 16777216使用(16384K)= 560144(547K深さがあるとき)= 16252928(15872K)MAX = 259522560(253440K) 空きメモリー15692784 のinit = 16777216(16384K)を使用= 560144(547K)コミット= 16252928(15872K)MAX = 259522560(253440K)
を犯し6500(スレッド "main"の例外java.lang.StackOverflowError)
init = 16777216(16384K)used = 288808(282K )コミット= 16252928(15872K)最大= 259522560(253440K) 空きメモリの開始15964120 空きメモリの最後15676656 init = 16777216(16384K)= 576272(562K)コミット= 16252928(15872K)max = 259522560(253440K)
私の質問は次のとおりです。
- finalize()を呼び出していません。メモリリークですか?
- N = 1000までの空きメモリの変更はありません。しかし、N = 1500の場合、プログラムの最後に使用されたメモリの値が2つ(すなわち、282Kと370K)になります。 なぜそれはそうですか?
- N = 6500の場合、JVMはエラーを生成します。だからなぜ最後の2つが試行されますか? try {}のステートメントが実行されます。
**観察**、私はJVMが放出し始めることがわかりました私は1-2 lakhsのようなオブジェクトの巨大な量を作成するときのメモリ。メモリリークではなく、GCが実際に必要なときにメモリを解放することを意味します。さらに、最初にオブジェクト9000を解放してから、8999、次に8998を解放するように、オブジェクトのトップをヒープ上に解放します。興味深い.. –
観測2:GCを実行した後でも、より高い使用領域を与えるgetHeapMemoryUsage。 –
http://stackoverflow.com/questions/6470651/creating-a-memory-leak-with-java:Javaのメモリリークに本当に便利です! – Val