После чтения этой старой статьи, измеряющей потребление памяти несколькими типами объектов, я был поражен, увидев, сколько памяти String
используется в Java
length: 0, {class java.lang.String} size = 40 bytes
length: 7, {class java.lang.String} size = 56 bytes
Хотя в статье есть несколько советов, чтобы свести к минимуму это, я не нашел их полностью удовлетворительными. Кажется, расточительно использовать char[]
для хранения данных. Очевидным улучшением для большинства западных языков было бы использовать byte[]
и такую кодировку, как UTF-8, так как вам нужен только один байт для хранения наиболее частых символов, а не двух байтов.
Конечно, можно использовать String.getBytes("UTF-8")
и new String(bytes, "UTF-8")
. Даже накладные расходы на экземпляр String исчезнут. Но тогда вы теряете очень удобные методы, такие как equals()
, hashCode()
, length()
,...
byte[]
представлении строк.
Рамки для эффективного представления строковых объектов в средах программирования Java
... Методы могут быть реализованы для создания строковых объектов Java как массивы однобайтовых символов, когда это подходит...
Но мне не удалось найти API для этого патента.
Почему меня это волнует? В большинстве случаев я этого не делаю. Но я работал над приложениями с огромными кешами, содержащими множество строк, которые могли бы извлечь выгоду из использования памяти более эффективно.
Знает ли кто-нибудь об этом API? Или есть ли другой способ сохранить объем памяти для строк небольшим, даже ценой производительности процессора или более уродливым API?
Пожалуйста, не повторяйте предложения из вышеуказанной статьи:
- собственный вариант
String.intern()
(возможно, сSoftReferences
) - сохранение единственного
char[]
и использование текущей реализацииString.subString(.)
во избежание копирования данных (противный)
Обновление
Я запустил код из статьи о Sun JVM (1.6.0_10). Это дало те же результаты, что и в 2002 году.