Ответ 1
Java7 или ниже
Использование памяти минимальной строки:
(bytes) = 8 * (int) ((((no chars) * 2) + 45) / 8)
So
80 = 8 * (int) ((((19) * 2) + 45) / 8)
Общие сведения об использовании памяти строк ( ИСТОЧНИК)
Чтобы понять приведенный выше расчет, нам нужно начать с просмотра полей объекта String. Строка содержит следующее:
- a char массив - таким образом отдельный объект, содержащий фактические символы;
- целочисленное смещение в массив, с которого начинается строка;
- длина строки;
- другой int для кэшированного вычисления хэш-кода.
Это означает, что даже если строка не содержит символов, для массива 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
- a char массив - таким образом отдельный объект, содержащий фактические символы;
-
целочисленное смещение в массив, с которого начинается строка; -
длина строки; - другой int для кэшированного вычисления хэш-кода.
Итак, в Java8 способ вычисления памяти для строк остается таким же, но вы должны вычесть 8 байт меньше из-за отсутствующих offset
и length
.