Строка [] Использование памяти - PullRequest
3 голосов
/ 09 декабря 2011

Я объявляю массив строк как:

String[] items1 = new String[5];
String[] items2 = new String[20];

Как сильно оба этих массива будут влиять на память и производительность, если оба будут содержать только 2 элемента.

Ответы [ 7 ]

3 голосов
/ 09 декабря 2011

Одноразмерный массив - это отдельный объект.Как и ожидалось, массив имеет обычный заголовок объекта.Тем не менее, этот заголовок объекта составляет 12 байтов для размещения четырехбайтовой длины массива.Затем идут фактические данные массива, которые, как вы можете ожидать, состоят из числа элементов, умноженного на количество байтов, требуемых для одного элемента, в зависимости от его типа.Использование памяти для одного элемента составляет 4 байта для ссылки на объект;список использования памяти примитивными типами см. на странице о типах данных Java.Если общее использование памяти массива не кратно 8 байтам, то размер округляется до следующего кратного числа 8 (как и для любого другого объекта).

См. Здесь: Как рассчитать использование памяти массивом Java

3 голосов
/ 09 декабря 2011

Вы можете проверить это сами.

public static void main(String... args) {
    long free1 = free();
    String[] two = new String[2];
    long free2 = free();
    String[] twenty = new String[20];
    long free3 = free();
    if (free3 == free1) System.err.println("You need to use -XX:-UseTLAB");
    System.out.println("String[2] took " + (free1 - free2) + " bytes and String[20] took " + (free2 - free3) + " bytes.");
}

private static long free() {
    return Runtime.getRuntime().freeMemory();
}

печатает

String[2] took 24 bytes and String[20] took 96 bytes.

Таким образом, вы можете тратить 72 байта памяти.Если ваша память стоит 10 долларов за ГБ, вы можете тратить 0,000072 цента памяти.Однако секунда вашего времени может стоить 2 цента.В этом случае буквально не стоит тратить миллисекунды, беспокоясь об этом.т.е. время, которое требуется для записи 20 вместо 2, стоит гораздо, гораздо больше.

2 голосов
/ 09 декабря 2011

Эффект будет незначительным, так как все, что вы делаете, это сохраняете дополнительные 3 и 18 нулевых ссылок соответственно.Хранение дополнительной нулевой ссылки существенно не увеличивает объем памяти и не оказывает заметного влияния на производительность вашего кода.

Однако, если вы заранее знаете, сколько элементов вы собираетесь хранить, похоже, в этом нет необходимости.для 5 или 20 массивов элементов.

2 голосов
/ 09 декабря 2011

Используя новое ключевое слово, вы определяете массив, связанный с его размером, в память, так что это зависит от того, сохраняете ли вы значение во всех или некоторых из них.если вам нужен динамический, тогда предпочтите массив с использованием объекта списка в качестве динамического, в то время как массив был предопределенным типом, поэтому после этого он не будет уменьшать или увеличивать свой размер, для этого вам нужно будет создать новый объект массива с его новым размером

0 голосов
/ 09 декабря 2011
Consumed_HEAP(items1) = (POINTER_SIZE*5) + Consumed_HEAP(items1[0])+Consumed_HEAP(items1[1]) + ARRAY_METADATA
Consumed_HEAP(items2) = (POINTER_SIZE*20) + Consumed_HEAP(items2[0])+Consumed_HEAP(items2[1]) + ARRAY_METADATA
POINTER_SIZE = x86 ? 4 : x64 ? 8 : ...
Consumed_HEAP(str) = str.length() * 2 + SOME_JVM_SPECIFIC_HEAP_FOR_STRING_REFERENCE_TYPE (~ 16-20) 

SOME_JVM_SPECIFIC_HEAP_FOR_STRING_REFERENCE_TYPE contains of all String fields:
1. reference from string to char array
2. memoized hash
3-n. other fields
n+1. link to class object
0 голосов
/ 09 декабря 2011

Оба содержат только ссылки на строки, поэтому память, используемая String [5] с двумя элементами, равна памяти, используемой String [5] с 0 элементами.То же самое касается строки [20].

Теперь память, используемая элементами, - это отдельная история.

0 голосов
/ 09 декабря 2011

Зависит от размера этих 2 элементов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...