2017-12-11 131 views
5

aşağıdaki kodu bir amacı, dizisi hesaplamak bellek boyutu, bildiğim kadarıyla oluşur, bunların, beklendiği gibi "24 bayt kullanılır" verir zaman:Java nesne dizisi boyutu

4bytes(element pointer)+16bytes(object header)+4bytes(element space) = 24bytes

// with JVM argument -XX:-UseTLAB 
public static void main(String[] args) { 
    long size = memoryUsed(); 
    Object[] o = new Object[]{1}; 
    //Object[] o = new Object[]{1L}; 
    size = memoryUsed() - size; 
    System.out.printf("used %,d bytes%n", size); 
    //Output: used 24 bytes 
} 

public static long memoryUsed() { 
    return Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory(); 
} 

Ancak, eleman tipi Long (1L) olarak değiştirildiğinde, sonuç kafa karıştırıcıdır, çoğu zaman "9,264 bayt kullanılır", herkes beni aydınlatabilir mi? Bu iki eleman tipi arasındaki bellek ayırma farkı nedir? JOL denilen için özel bir alet olduğuna olarak

// with JVM argument -XX:-UseTLAB 
public static void main(String[] args) { 
    long size = memoryUsed(); 
    //Object[] o = new Object[]{1}; 
    Object[] o = new Object[]{1L}; 
    size = memoryUsed() - size; 
    System.out.printf("used %,d bytes%n", size); 
    //Output: used 9,264 bytes 
} 
+1

Muhtemelen ikinci dizi oluşturmak için JVM beklediğinizden daha fazla bellek tüketen ek sınıflar ('Long' ve iç sınıf 'Long.LongCache' gibi) yüklemelidir. –

+0

Olası çoğaltılabilir [Java'da, nesnenin boyutunu belirlemenin en iyi yolu nedir?] (Https://stackoverflow.com/questions/52353/in-java-what-is-the-best-way-to -bir-boyut-of-bir-nesnenin boyutu) –

cevap

0

, genel olarak bir nesne boyutunu hesaplamak için daha iyi bir yol yoktur.

Bu konu hakkında ne düşündüğünüz tamamen doğru değil. Bu nesnenin toplam boyutu 40 bytes olacaktır. Bu boşluk nereden geldiğini Bakalım:

12 bytes headers (8 bytes + 4 bytes, since there are two headers) 

Bunu 16 bytes (8 + 8) var, ama varsayılan olarak açıktır compressed oops seçeneği yoktur. -XX:-UseCompressedOops aracılığıyla devre dışı bırakabilirsiniz ve gerçekten bu durumda başlıkların boyutu 16 bytes olacaktır.

4 bytes size of the array (arrays have an int size that is stored in headers) 
4 bytes is the reference size of the Integer (1) 
4 bytes alignment (since objects are 8 bytes aligned - this is the trick behind CompressedOops btw) 

Şu an için dizi için 24 bytes var.

Şimdi, böylece de bir nesne olduğunu, içinde bir Tamsayı, depolamak:

12 bytes headers 
4 bytes for the actual int value inside Integer 

Böylece toplam boyutu 40 bytes olduğunu.

+0

Bu dizide depolanan Tamsayı, ilkel türü olabilir, bu yüzden fazla 16bytes nesne üstbilgisini kaydeder –

+0

@ 鄭 无爲 iyi bir "Nesne" olarak ilan ettiniz '' Tamsayı' olacak; Eğer o alanı kaydetmek istiyorsan, onu int (int) olarak ilan etmelisin. – Eugene