Резюме
Принять более компактное внутреннее представление для строк.
Цель
Повышение эффективности использования пространства классом String и связанными с ним классами при сохранении производительности в большинстве сценариев и сохранении полной совместимости для всех связанных Java и нативных интерфейсов.
Non-цели
Не стоит использовать альтернативные кодировки, такие как UTF-8, для внутреннего представления строк. Последующий JEP может изучить этот подход.
Мотивация
Текущая реализация класса String хранит символы в массиве символов, используя два байта (шестнадцать бит) для каждого символа. Данные, собранные из разных приложений, указывают на то, что строки являются основным компонентом использования кучи и, более того, что большинство объектов String содержат только символы Latin-1. Для таких символов требуется только один байт, поэтому половина пространства во внутренних массивах таких объектов String не используется.
Описание
Мы предлагаем изменить внутреннее представление класса String с массива символов UTF-16 на байтовый массив плюс поле флага кодирования. Новый класс String будет хранить символы, закодированные как ISO-8859-1 / Latin-1 (один байт на символ), или как UTF-16 (два байта на символ) в зависимости от содержимого строки. Флаг кодирования будет указывать, какая кодировка используется.
Классы, связанные со строками, такие как AbstractStringBuilder, StringBuilder и StringBuffer, будут обновлены для использования того же представления, что и встроенные строковые операции виртуальной машины HotSpot.
Это чисто изменение реализации, без изменений существующих открытых интерфейсов. Не планируется добавлять какие-либо новые публичные API или другие интерфейсы.
Проделанная до настоящего времени работа по созданию прототипа подтверждает ожидаемое сокращение объема памяти, существенное снижение активности GC и незначительные регрессии производительности в некоторых угловых случаях.