Khi kích thước bộ nhớ tính toán của một mảng đối tượng, mã sau đây cho "sử dụng 24 byte" như mong đợi, mà, theo như tôi biết, bao gồm:java kích thước mảng đối tượng
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();
}
Nhưng khi loại phần tử thay đổi thành Long (1L), kết quả là khó hiểu, phần lớn thời gian là "đã sử dụng 9,264 byte", ai cũng có thể giúp tôi khai sáng? sự khác biệt trong phân bổ bộ nhớ giữa loại phần tử hai này là gì?
// 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
}
Có lẽ để tạo mảng thứ hai, JVM phải nạp các lớp bổ sung (như 'Long' và lớp nội bộ' Long.LongCache') tiêu thụ nhiều bộ nhớ hơn bạn mong đợi. –
Bản sao có thể có của [Trong Java, cách tốt nhất để xác định kích thước của một đối tượng là gì?] (Https://stackoverflow.com/questions/52353/in-java-what-is-the-best-way-to -determine-the-size-of-an-object) –