Использование памяти Java String Array - PullRequest
3 голосов
/ 17 января 2012

Сколько места занимает массив строк Java?Более конкретно, сколько места (в байтах) занимает строковый массив, который выглядит примерно так:

Longbowman 
kingdom   
lord    
weapon1,weapon2,weapon3    
armor1,armor2,armor3

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

Итак, скажем, сколько места занимает строковый массив (если его можно измерить)?

Ответы [ 5 ]

16 голосов
/ 17 января 2012

Строка массив - это просто массив ссылок - массив размера N займет приблизительно (N * 4 + 20) или (N * 8 + 20) байтов в зависимости от размера ссылки в вашей JVM.

Если вас интересует общее хранилище, вы должны определить, сколько у вас есть отдельных объектов String, а и , сколько у вас массивов. Если у вас есть 5000 массивов, но они в основном содержат ссылки на те же несколько строк, это, вероятно, будет хорошо. Если у вас есть 5000 массивов, каждый из которых содержит 5 строк, которые больше нигде не используются, это 25 000 строк ... что, вероятно, не так уж много (строка длиной 20, вероятно, займет около 60 байтов).

Конечно, здесь важен контекст: на чем будет выполняться ваш код? Если он работает на настольном ПК, то, вероятно, проблема не в том, чтобы принять несколько мегабайт ... это может быть более серьезной проблемой на телефоне.

1 голос
/ 17 января 2012

Единственный способ точно измерить использование памяти - использовать профилировщик памяти.

Я написал простую программу, которая выделяет 5000 массивов, соответствующих вашему описанию.Затем я измерил использование памяти с помощью YourKit.

Объем памяти, используемый массивами, варьировался в десять раз:

  1. Если все массивы используют одинаковые строковые литералы,в общей сложности они занимают около 200 КБ ОЗУ.
  2. Если каждый массив содержит уникальные случайно сгенерированные строки (той же длины, что и в первом случае), они занимают около 2 МБ ОЗУ.
1 голос
/ 17 января 2012

Ответить нелегко, так как строка является сложным объектом со многими полями. Это не только вопрос количества символов. И это также зависит от того, сколько памяти доступно в вашей системе. На сервере 64 ГБ ОЗУ это проблема? А на мобильном телефоне? Да. Слишком много переменных могут повлиять на ответ.

Вы управляете своим кодом с помощью оптимизации, и это не так, как должно быть. Вы должны управлять своим кодом тем, что вы хотите сделать функционально.

1 голос
/ 17 января 2012

Массивы строк могут занимать столько, сколько вы хотите?Вы определяете размер массива String.Строка [] abc = новая строка [80].Но я полагаю, вы уже знаете это ... может быть, я не получил ваш вопрос.

1 символ = 2 байта, а не 4 байта, поскольку Java использует 16-битный Unicode - это то, что вы ищете?

Integer.MAX_VALUE или доступная куча?возможно максимальный размер в наличии?

0 голосов
/ 17 января 2012

Джон Скит прав (как и всегда), но вы можете значительно сократить использование памяти, используя ссылки на enums и EnumSets вместо «нетипизированных» строковых представлений ваших объектов, которые вы предлагаете.

Использование типизированных данных, особенно enums, также является хорошей практикой кодирования.

...