Почему использование памяти в строке String Java считается высоким? - программирование
Подтвердить что ты не робот

Почему использование памяти в строке String Java считается высоким?

В этом сообщении в блоге говорится, что минимальное использование памяти в строке:

8 * (int) ((((no chars) * 2) + 45) / 8) байты.

Итак, для строки "Apple Computers" минимальное использование памяти будет 72 байта.
Даже если у меня есть 10000 объектов String в два раза больше, использование памяти будет меньше 2 Мб, что совсем не так. Значит ли это, что я недооцениваю количество строк, присутствующих в корпоративном приложении, или эта формула неверна?

Спасибо

4b9b3361

Ответ 1

Хранилище строк в Java зависит от того, как была получена строка. Массив char может использоваться совместно несколькими экземплярами. Если это не так, у вас есть обычная служебная нагрузка и хранение для одного указателя и три int, которые обычно выводятся на служебные данные на 16 байт. Тогда для поддержки массива требуется 2 байта за char, так как char являются кодовыми единицами UTF-16.

Для "Apple Computers", где массив подстановки не используется совместно, минимальная стоимость будет

  • массив поддержки для 16 символов - 32B, который хорошо выравнивается на границе слова.
  • указатель на массив - 4 или 8B в зависимости от платформы
  • три int для смещения, длины и memoized hashcode - 12B
  • 2 накладных расходов на объект - зависит от виртуальной машины, но 8B - хорошее эмпирическое правило.
  • один int для длины массива.

Так примерно 72B, из которых фактическая полезная нагрузка составляет 44,4%. Полезная нагрузка составляет больше для более длинных строк.


В Java7 некоторые реализации JDK устраняют общий доступ к массиву, чтобы избежать закрепления больших char [] s в памяти. Это позволяет им избавиться от 2 из трех int s.

Это изменяет вычисление до 64B для строки длиной 16, из которой фактическая полезная нагрузка составляет 50%.

Ответ 2

Можно ли сохранить данные символа, используя меньше памяти, чем Java String? Да.

Имеет ли значение для "корпоративных" приложений (или даже приложений Android или J2ME, которым приходится преодолевать гораздо меньшую память)? Больше никогда.

Преждевременная оптимизация - это корень...

Ответ 3

По сравнению с другими типами данных, которые у вас есть, он определенно высок. Другие примитивы используют 32 бита, 64 бит и т.д.

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