Оптимизация пространства String после Java9

Java задняя часть глубокое обучение Tomcat
Оптимизация пространства String после Java9

предисловие

Насколько я знаю, Java-разработчики почти всегда думают о String, и String действительно стал наиболее часто используемым классом и используется очень часто. Все мы знаем, что String на самом деле инкапсулирует символы, которые должны храниться в виде символов или массивов байтов.Начиная с Java9, разработчики языка Java внесли некоторые оптимизации пространства для String.

От символа к байту

Реализация класса String библиотеки до JDK9 использует массив char для хранения строк, а char занимает 16 бит, то есть два байта.

private final char value[];

В этом случае, если мы хотим хранить символыA, тогда0x00 0x41, предыдущий один байт пространства теряется. Но если вы сохраните китайские иероглифы, отходов не будет, то есть, если вы сохраните символы в кодировке ISO-8859-1, они будут потрачены впустую, а символы вне не будут потрачены впустую.

Реализация класса String после JDK9 использует массив байтов для хранения строк, и каждый байт занимает 8 бит, то есть 1 байт.

private final byte[] value

кодирование

Строка поддерживает несколько кодировок, но если кодировка не указана, она может использовать две кодировки: LATIN1 и UTF16. LATIN1 может быть относительно незнакомой, но на самом деле это кодировка ISO-8859-1, которая является однобайтовой кодировкой. Хотя UTF16 является двухбайтовой кодировкой, она использует для хранения 1 или 2 16-битных пробела.

сжатое пространство

Сжатые символьные объекты в основном представляют собой символы в кодировке ISO-8859-1, такие как английские буквы, цифры и другие распространенные символы. Для лучшего понимания давайте посмотрим на рисунок ниже Если у нас есть строка "что", то если до Java9 ее хранение было организовано в следующей очереди, то видно, что для хранения каждого символа требуется 16 бит, а старший Все байтовые биты равны 0, что на самом деле является пустой тратой.

这里写图片描述

После Java9 его устройство хранения стало очень компактным, как показано ниже, требуется всего четыре байта.

这里写图片描述

Но если это «ha a», макет выглядит так, как показано ниже, поэтому, если символы в строке содержат символы, не входящие в кодировку ISO-8859-1, они все равно сохраняются в единой 16-битной длине.

这里写图片描述

Строка Java9 по умолчанию использует указанную выше компоновку компактного пространства. См. следующий код. По умолчанию COMPACT_STRINGS имеет значение true. А если вы хотите отменить компактную компоновку, вы можете настроить параметры ВМ по-XX:-CompactStringsвыполнить.

static final boolean COMPACT_STRINGS;
static {
    COMPACT_STRINGS = true;
}

длина строки

Поскольку реализация String была изменена для использования кодировки UTF-16 или LATIN-1, для внутреннего использования требуется идентификатор.coderЧтобы указать, какая кодировка используется, значение LATIN1 равно 0, а значение UTF16 равно 1.

private final byte coder;
static final byte LATIN1 = 0;
static final byte UTF16  = 1;

Длина строки также связана с кодировкой, и вычисление осуществляется сдвигом вправо. Если это кодировка LATIN-1, сдвиньте вправо на 0 бит, а длина массива равна длине строки. А если это кодировка UTF16, то она сдвигается вправо на 1 бит, и половина длины массива составляет длину строки.

public int length() {
    return value.length >> coder();
}

Суммировать

Строковый объект — это активно используемый объект в Java, и мы легко будем использовать его много, не учитывая его стоимость, поэтому его оптимизация пространства необходима, Java9 стала помогать нам уменьшать строки в куче, занимать место и уменьшать нагрузку на сборщик мусора. В то же время видно, что эта оптимизация пространства не имеет большого значения для китайцев.

------------- Рекомендуем прочитать ------------

Резюме моей статьи за 2017 год — машинное обучение

Краткое изложение моих статей за 2017 год — Java и промежуточное ПО

Резюме моих статей 2017 года — глубокое обучение

Краткое изложение моих статей за 2017 год — исходный код JDK

Резюме моей статьи за 2017 год — обработка естественного языка

Резюме моих статей 2017 года — Java Concurrency


Поговори со мной, задай мне вопросы:

这里写图片描述

Меню официальной учетной записи было разделено на «Сводка для чтения», «Распределенное», «Машинное обучение», «Глубокое обучение», «НЛП», «Глубина Java», «Ядро параллелизма Java», «Исходный код JDK», "Tomcat Core" "Подождите, может быть, есть тот, который соответствует вашему аппетиту.

Зачем писать «Анализ проектирования ядра Tomcat»

Добро пожаловать, чтобы следовать:

这里写图片描述