Сколько памяти использует строка в Java 8?

Я много читал о распределении памяти для строк в последнее время и не могу найти никаких подробностей, если все то же самое с Java 8.

Сколько пространства памяти будет использовать String как "Alexandru Tanasescu" в Java 8? Я использую 64-битную версию.

Java7 или ниже

Минимальное использование памяти строк:

 (bytes) = 8 * (int) ((((no chars) * 2) + 45) / 8) 

Так

 80 = 8 * (int) ((((19) * 2) + 45) / 8) 

Понимание использования памяти строк ( SOURCE )

Чтобы понять приведенный выше расчет, нам нужно начать с просмотра полей объекта String. Строка содержит следующее:

  • массив символов – таким образом отдельный объект, содержащий фактические символы;
  • целочисленное смещение в массив, с которого начинается строка;
  • длина строки;
  • другой int для кэшированного вычисления hash-кода.

Это означает, что даже если строка не содержит символов, для массива символов char потребуется 4 байта плюс 3 * 4 = 12 байтов для трех полей int и 8 байтов заголовка объекта. Это дает 24 байта (что кратно 8, так что до сих пор нет «заполняющих» байтов).

Затем (пустой) char-массив потребует еще 12 байт (для массивов требуется 4 байта для хранения их длины), плюс в этом случае 4 байта заполнения, чтобы довести память, используемую объектом массива char, до кратного 16. Таким образом, пустая строка использует 40 байт.

Если String содержит, скажем, 19 символов, то сам объект String по-прежнему требует 24 байта. Но теперь для массива char требуется 12 байт заголовка плюс 19 * 2 = 38 байт для семнадцати символов. Так как 12 + 38 = 50 не кратно 8, нам также нужно округлить до следующего кратного 8 (56). Таким образом, наша 19-символьная String будет использовать 56 + 24 = 80 байт.


Java8.

Java 8 больше не имеет offset и length . Только hash и CharArray .
@Thomas Jungblut

  • массив символов – таким образом отдельный объект, содержащий фактические символы;
  • целочисленное смещение в массив, с которого начинается строка;
  • длина строки;
  • другой int для кэшированного вычисления hash-кода.

Таким образом, в Java8 способ вычисления памяти для строк остается таким же, но вы должны вычесть 8 байт меньше из-за отсутствия offset и length .

Если вы посмотрите на источники Oracle Java 8, у вас есть:

Значение char value[] и int hash . char имеет 2 байта, а int – 4 байта.

Так ответ не будет yourstring.length * 2 + 4?

Нет. У каждого предмета были накладные расходы. Например, массив хранит свои размеры. И как массив (объект), так и строка будут нести дополнительную память из сборщика мусора, хранящего информацию о них.

Нет надежного способа вычислить это, потому что AFAIK каждый JRE и JDK не несет ответственности за размер накладных расходов на объект.

«Alexandru Tanasescu» использует 104 байта. Вот как получить размер

  long m0 = Runtime.getRuntime().freeMemory(); String s = new String("Alexandru Tanasescu"); long m1 = Runtime.getRuntime().freeMemory(); System.out.println(m0 - m1); 

Примечание: запустите его с помощью опции -XX: -UseTLAB

Согласно следующему JEP: http://openjdk.java.net/jeps/254

Текущая реализация classа String хранит символы в массиве char, используя два байта (шестнадцать бит) для каждого символа.

В Java SE 9 это может измениться.

Обратите внимание, однако, поскольку это JEP не JSR (и он упоминает реализацию), я понимаю, что это реализация, специфичная и не определяемая JLS.

  • Каков наилучший способ преобразования между char * и System :: String в C ++ / CLI
  • как заменить одиночную обратную косую черту в R
  • Как разбить строку на пробел
  • Почему .ToString () в нулевой строке вызывает нулевую ошибку, когда .ToString () отлично работает в nullable int с нулевым значением?
  • Легальность реализации COW std :: string в C ++ 11
  • Нечувствительная к регистру строка в C
  • Преобразование двоичной строки в целое число
  • Является ли регистр C # нечувствительным к оператору?
  • Java - удаление первого символа строки
  • Разделить строку, на каждой n-й позиции
  • Как работает Integer.parseInt (строка)?
  • Interesting Posts

    Определение типов данных столбцов фрейма данных

    Что такое файл crossdomain.xml?

    Linux: интерпретируется на чтение (ala php) для локальных файлов

    Что, если установить x.domain.com и y.domain.com на тот же IP-адрес в DNS?

    MVC, кнопка отправки которого нажата

    Каковы преимущества сохранения невежества?

    Как выполнить выбор флажка «Однократный щелчок» в WPF DataGrid?

    Есть ли вероятность того, что IP-пакет с одним и тем же IP-адресом источника и получателем может попасть в сеть?

    Как реализовать «mustMatch» и «selectFirst» в автозаполнении пользовательского интерфейса jQuery?

    Перевести индекс столбца в имя столбца Excel

    Adobe AIR – Пользовательский предварительный загрузчик с изображением

    Поддерживает ли Win7 планирование резервного копирования образа системы?

    Есть ли способ автоматически включать файлы содержимого в файл проекта asp.net?

    Есть ли синтаксический анализатор CSS для C #?

    Остановить Visual Basic 6 от замены моего корпуса

    Давайте будем гением компьютера.