Статьи

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 будет поступать из кэша автобокса и не использовать дополнительную память Все возможные логические и байтовые значения кэшируются.

массив размер в байтах
32-битной JVM
размер в байтах
64-битной JVM
новый BitSet (1024) 168 168
новый логический [1024] 1040 1040
новый логический [1024] 4112 4112
новый ArrayList <Boolean> (1024) 4136 4136
новый LinkedList <Boolean> () с 1024 24624 24624
новый байт [1024] 1040 1040
новый байт [1024] 4112 4112
новый ArrayList <Byte> (1024) 4136 4136
новый LinkedList <Byte> () с 1024 24624 24624
новый символ [1024] 2064 2064
новый персонаж [1024] 18448 18448
новый короткий [1024] 2064 2064
новый короткий [1024] 18448 18448
новый ArrayList <Character / Short> (1024) 18472 18472
новый LinkedList <Character / Short> () с 1024 38960 38960
новый int [1024] 4112 4112
новое целое число [1024] 18448 18448
новый поплавок [1024] 4112 4112
новый поплавок [1024] 20496 20496
новый ArrayList <Integer / Float> (1024) 18472 18472
новый LinkedList <Integer / Float> () с 1024 38960 38960
новый длинный [1024] 8208 8208
новый длинный [1024] 18448 25616
новый двухместный [1024] 8208 8208
новый двухместный [1024] 20496 28688
новый ArrayList <Long / Double> (1024) 18472 25640
новый LinkedList <Long / Double> () с 1024 38960 46128
новая строка [1024] 52464 61456
новый ArrayList <String> (1024) 52488 61480
новый LinkedList <String> () с 1024 72976 81968

В обоих случаях использовалось обновление Java 6 26. Для 64-разрядной JVM этой версии
-XX: + UseCompressedOops является параметром по умолчанию, который использует 32-разрядные ссылки. Если вы используете более 32 ГБ памяти, вам нужно отключить эту опцию, используя больше памяти для массивов объектов.

Полный код

Доступен здесь: MemoryUsageExamplesTest

От http://vanillajava.blogspot.com/2011/07/java-how-much-memory-do-different.html