Java
July 2011 25

Сравнение потребления памяти у разных структур хранения данных

Original author: Peter Lawrey
Translation
Различные структуры в Java потребляют разное количество памяти. Поэтому для нас очень важен выбор наиболее эффективного метода хранения данных.

Какая будет разница по потреблению памяти между конструкциями `new int[1024]` и `new Integer[1024]`?

int[] ints = new int[1024];
for (int i = 0; i < ints.length; i++) ints[i] = i;

Integer[] ints = new Integer[1024];
for (int i = 0; i < ints.length; i++) ints[i] = i;


Примечание: 1/8 часть значений типа Integer будут закешированы и не скушают лишнюю память. Все значения типов Boolean и Byte тоже будут закешированы.

Структура JVM 32-bit(размер в байтах) JVM 64-bit(размер в байтах)
new BitSet(1024) 168 168
new boolean[1024] 1040 1040
new Boolean[1024] 4112 4112
new ArrayList<Boolean>(1024) 4136 4136
new LinkedList<Boolean>() with 1024 24624 24624
new byte[1024] 1040 1040
new Byte[1024] 4112 4112
new ArrayList<Byte>(1024) 4136 4136
new LinkedList<Byte>() with 1024 24624 24624
new char[1024] 2064 2064
new Character[1024] 18448 18448
new short[1024] 2064 2064
new Short[1024] 18448 18448
new ArrayList<Character/Short>(1024) 18472 18472
new LinkedList<Character/Short>() with 1024 38960 38960
new int[1024] 4112 4112
new Integer[1024] 18448 18448
new float[1024] 4112 4112
new Float[1024] 20496 20496
new ArrayList<Integer/Float>(1024) 18472 18472
new LinkedList<Integer/Float>() with 1024 38960 38960
new long[1024] 8208 8208
new Long[1024] 18448 25616
new double[1024] 8208 8208
new Double[1024] 20496 28688
new ArrayList<Long/Double>(1024) 18472 25640
new LinkedList<Long/Double>() with 1024 38960 46128
new String[1024] 52464 61456
new ArrayList<String>(1024) 52488 61480
new LinkedList<String>() with 1024 72976 81968


Полный код доступен здесь

З.Ы. Предположительно все это должен знать любой JAVA разработчик, но если кто-то не знает, то улыбаемся и машем читаем и запоминаем :)
+32
19k 198
Comments 43
Top of the day