2011-03-15 19 views
3

Javaラッパークラスで新しいopeartorを使用してメモリ割り当てに違いはありますか?クラスについてJavaラッパークラスで新しいopeartorを使用してメモリ割り当てに違いはありますか?

public class TestClass1 { 

    Integer i=new Integer(1); 

} 

用としてメモリのサイズは32バイトである場合、割り当てられたメモリの

public class TestClass { 
    Integer r=9; 
} 

サイズは、32ビットのJVMに5152バイト

あります。

TestClass1クラスのメモリ割り当てが少ないのはなぜですか?

答えて

1

これはどのように測定していますか?

ライン

+0

これを測定するために以下のコードを使用します。 – adsk

+0

しかし、これらのメンバーは、デフォルトのパッケージプライベートアクセス修飾子を持つため外部から参照できます。 – krock

0
public class Sizer { 

    public static void main(String [] args) throws Exception { 
    Runtime r = Runtime.getRuntime(); 

    // Pre-instantiate variables 
    long memoryBefore = 0; 
    long memoryAfter = 0; 
    int loops = 10; 

    runGC(r, loops); 
    memoryBefore = getMemoryUsage(r); 

//  Long lo = new Long(1); 
    TestClass in = new TestClass(); 

    runGC(r, loops); 
    memoryAfter = getMemoryUsage(r); 

    System.out.println("Diff in size is " + (memoryAfter - memoryBefore)); 
    } 

    public static void runGC(Runtime r, int loops) throws Exception { 
    for(int i=0; i<loops; i++) { 
     r.gc(); 
     Thread.sleep(2000); 
    } 
    } 

    public static long getMemoryUsage(Runtime r) throws Exception { 
    long usedMemory = r.totalMemory() - r.freeMemory(); 
    System.out.println("Memory Usage: " + usedMemory); 
    return usedMemory; 
    } 

} 
+0

こんにちは、スタック上であなたの投稿を編集することができます。これをより明確にするために質問に移動することを検討することができます。 –

+0

フルGCを複数回実行しても何もしません(同じ時間に複数のスレッドを割り当てる場合を除く) – bestsss

+0

空きメモリの精度は、通常はMBの範囲内です。つまり、多くのオブジェクトを割り当てることができ、空きメモリを変更することはできません。私はあなたが配列でこれらの1000万を作成しようとすると、それがどのくらいの違いを参照してくださいお勧めします。 –

2

空のクラスへの参照を残して、JVMはそのは使ったことがないことから、TestClass1の整数を離れて最適化するだけでなく、その権利の範囲内であろうと私には思える:

Integer r = 9; 

実際なる:

Integer r = Integer.valueOf(9); 
キャッシュ整数オブジェを取得オートボクシングに起因

ct。ボクシングのコンバージョンでJLS Section 5.1.7をチェックすると、-128と127の間の整​​数値がキャッシュされることが示されます。実際には、Integer.valueOf()(オートボクシングの発生を含む)への最初の呼び出しは、異なるメモリフットプリントを占めるキャッシュを初期化する。

+1

その場合、TestClass1より少ないメモリしか持たないでしょうか? – adsk

+0

メモリのサイズが異なる可能性のある整数キャッシュの初期化を含むように答えを広げました。 – krock

1

Integer.valueOf必ずしも新しいオブジェクトを作成するとは限りません。なぜメモリ割り当てが異なるのですか

Integer r = 9; 
0

Q:TestClass1クラスのメモリ割り当てが少ないのはなぜですか?

は、すでに述べたようにkrockが

Integer i = 9; 

を言及したキャッシュは、あなたがそれを使用する前に初期化する必要があることをこの命令の原因

Integer i = Integer.valueOf(9); 

になります。

キャッシュには-128から通常127までの値が含まれており、255個の値を初期化する必要があります(new Integer(i))。そして、これはそのような大きなメモリ使用量を引き起こします。

再開命令

  • i = new Interger(9);は、 - 少なくとも255個のIntegerオブジェクトとつのアレイを作成する - 1つの整数オブジェクト、
  • i = 9;を作成します。

FYI:キャッシュ初期化はボックス化された値に依存しません。キャッシュは、ボクシング値が-128より小さく、通常は127より大きい場合にも初期化されます。

+0

おかげでkrockとvash。 – adsk

関連する問題