Я пытаюсь выяснить, сколько памяти используется массивом внутри JVM. Я настроил программу для этой цели, что дает мне нечетные результаты.Сколько памяти использует массив Java?
protected static long openMem(){
System.gc();
System.runFinalization();
return Runtime.getRuntime().freeMemory();
}
public static double listSize(int limit){
long start= openMem();
Object[] o= new Object[limit];
for(int i= 0; i<limit; i++){
o[i]= null;
}
long end= openMem();
o= null;
return (start-end);
}
public static void list(int i){
for(int y= 0; y<50; y++){
double d= Quantify.listSize(i);
System.out.println(i+" = "+d+" bytes");
}
}
public static void main(String ... args){
list(1);
list(2);
list(3);
list(100);
}
Когда я запускаю это, я получаю два разных байт-размера для каждого размера массива, например:
- 1 = 24,0 байт
- 1 = 208,0 байт
- 1 = 24,0 байт
- 1 = 208,0 байт
- 1 = 208,0 байт
- 1 = 208,0 байт
- 1 = 208,0 байт
- 1 = 24,0 байт
Так массив из 1 элемента только когда-либо возвращает «24 байта» или «208 байт», и та же картина имеет место для всех остальных:
1 = 24,0 байт
1 = 208,0 байт
2 = 24,0 байт
2 = 208,0 байт
3 = 32,0 байт
3 = 216,0 байт
100 = 416,0 байт
100 = 600,0 байт
Я пытаюсь выяснить, почему это является. Мне интересно, может ли кто-нибудь еще здесь (а) уже знать ответ, или (б) знает, как найти ответ.
Я никогда не рекомендую измерять что-либо через дедушки freemem.Создайте некоторый типизированный массив, например MyClass [], и запустите jmap -histo: live. Память не является детерминированной во всяком случае, и Java runtime может иметь свои собственные кеши и объекты, потоки, поэтому вы можете количественно определить что-либо через delta freemem, вы можете получить номер шара для текущей используемой или свободной памяти, но пытаться измерить один объект (как массив) - бесполезное усилие. Массив потребляет заголовок объекта + 4bytes length + sun.misc.Unsafe.ADDRESS_SIZE * array.length –
bestsss