2012-03-21 16 views
1

デフォルトのGCを1.6.0_27-b07(SunのJRE)で使用しています。this私はメモリの増加を検出できませんRuntime.getRuntime()。freeMemory()を使用してください。誰かがこれを達成する方法について光を当てることができますか?別のGCを使用する必要がありますか?どれ?Runtime.freeMemory()とGCを使用してJVM上のオブジェクトのインスタンスを追跡する方法

以下の簡単なプログラムは、割り当てられたメモリに対して0を出力します。 :(:(:(

import java.util.HashSet; 
import java.util.Set; 

public class MemoryUtils { 

    private static Set<String> set = new HashSet<String>(); 

    public static void main(String[] args) { 

     long mem = Runtime.getRuntime().freeMemory(); 

     // now create a bunch of objects and save them in the set 
     for (int i = 0; i < 100; i++) { 
      set.add("foo" + i); 
     } 

     long allocated = mem - Runtime.getRuntime().freeMemory(); 

     System.out.println("Memory allocated: " + allocated); // ===> GIVES 0 !!!! 

    } 
} 
+0

I + 'ではなく'「foo」というの(「foo」という+ I) '新しいStringをお試しください'リテラル文字列はStringプールに格納されます。 –

+0

@ Eng.Fouadいいえ、違いはありません。それはDavid Tinkerが言ったことと関係がある。 – chrisapotek

+0

@ Eng.Fouadあなたはおそらく 'intern()'メソッドと混乱しているかもしれませんが、String(String)コンストラクタは参照されるchar []が文字列のサイズと全く同じであることを保証します。 –

答えて

3

これらのオブジェクトは短命オブジェクトのために予約された空間に割り当てられ、彼らはしばらくの間、存続する場合にのみ、メインヒープに移動されます。

あなたは本当にプロファイラを使用する必要がありますあなたは、あなたのアプリケーションが作成したすべてのオブジェクトで起こって正確にいただきました!見たい場合はここで

は、いくつかの詳細は次のとおりです。Java Memory explained (SUN JVM)

+0

あなたはありますが、私はすべてを追跡したい私のプログラムのオブジェクト作成。私は私のGCをfreeMemory()で追跡できるように、ヒープにすべてを書き込む何かに変更する必要がありますか?これはベンチマーク用であり、生産用ではありません。 – chrisapotek

+0

GCの変更が​​役に立たないと思います。メモリ統計は、GCが最後に発生したときなどに依存します。 –

+0

freeMemoryは使用できないため、私は新しい質問を開きます。> http://stackoverflow.com/questions/9810212/how-to-track-任意のオブジェクト作成、java-in-freememory-only-reports-long-li – chrisapotek

関連する問題