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