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
}
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. –
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) –