Поддержка сжатых строк, отбрасываемых в HotSpot JVM? - PullRequest
58 голосов
/ 12 января 2012

На этой странице Oracle Параметры виртуальной машины Java HotSpot , он перечисляет -XX:+UseCompressedStrings как доступные и включенные по умолчанию. Однако в обновлении 29 для Java 6 по умолчанию оно отключено, а в обновлении 2 для Java 7 выдается предупреждение

Java HotSpot(TM) 64-Bit Server VM warning: ignoring option UseCompressedStrings; support was removed in 7.0

Кто-нибудь знает причину удаления этой опции?


сортировка строк огромного файла .txt в java

При -mx2g этот пример занял 4,514 секунды с включенной опцией и 5,206 секунды с отключенной в обновлении 29 Java 6. Трудно понять, что это влияет на производительность.

Примечание. Для обновления Java 7 2 требуется 2,0 ГБ, а для обновления 29 Java 6 без сжатых строк - 1,8 ГБ, а со сжатой строкой - только 1,0 ГБ.

Ответы [ 5 ]

40 голосов
/ 24 апреля 2012

Первоначально эта опция была добавлена ​​для улучшения производительности SPECjBB.Прибыль обусловлена ​​снижением требований к пропускной способности памяти между процессором и DRAM.Загрузка и хранение байтов в байте [] потребляет вдвое меньше пропускной способности по сравнению с символами в char [].

Однако это имеет свою цену.Код должен определить, является ли внутренний массив байтом [] или символом [].Это занимает процессорное время, и если рабочая нагрузка не ограничена памятью пропускная способность , это может вызвать снижение производительности.Существует также цена обслуживания кода из-за дополнительной сложности.

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

Есть еще один угол к этому.Опция уменьшает использование кучи.Для применимых строк это уменьшает использование памяти этими строками на 1/2.Этот угол не учитывался во время удаления опции.Для рабочих нагрузок, объем памяти которых ограничен ограничен (т. Е. Приходится работать с ограниченным пространством кучи, а сборщик мусора занимает много времени), этот параметр может оказаться полезным.

Если достаточно памяти объемМожно найти связанные с производством рабочие нагрузки, чтобы оправдать включение опции, затем возможно , вариант будет возвращен.

Редактировать 20.03.2013: Средний дамп кучи сервера занимает 25% пространства в строках.Большинство строк являются сжимаемыми.Если эта опция будет введена заново, она может сэкономить половину этого пространства (например, ~ 12%)!

Редактировать 3.10.2016: Функция, похожая на сжатые строки, возвращается в JDK9 JEP 254 .

14 голосов
/ 05 апреля 2013

Просто добавьте, для заинтересованных ...

Интерфейс java.lang.CharSequence (который реализует java.lang.String), позволяет более компактное представление строк, чем UTF-16.

Приложения, которые манипулируют множеством строк, вероятно, должны быть написаны так, чтобы принимать CharSequence, чтобы они работали с java.lang.String, или более компактными представлениями .

8-битный (UTF-8), или даже 5, 6, или 7-битный кодированный, или даже сжатые строки могут быть представлены как CharSequence.

CharSequence s можеттакже намного эффективнее манипулировать - подпоследовательности могут быть определены, например, как представления (указатели) на исходное содержимое вместо копирования.

Например, в concurrent-trees , суффиксДерево из десяти пьес Шекспира, требует 2 ГБ ОЗУ с использованием CharSequence узлов на основе, а потребуется 249 ГБ ОЗУ при использовании char [] или Stringузлы на основе.

13 голосов
/ 12 января 2012

Поскольку проголосовали против, я полагаю, что я не пропустил что-то очевидное, поэтому я зарегистрировал это как ошибку (по крайней мере, упущение в документации)

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7129417

(должно появиться через пару дней)

6 голосов
/ 02 мая 2016

Java 9 выполняет строки сортировки огромного файла file.txt в java на моей машине в два раза быстрее, чем Java 6, и также требует только 1 ГБ памяти, поскольку по умолчанию -XX:+CompactStrings включено. Кроме того, в Java 6 сжатые строки работают только для 7-битных символов ASCII, тогда как в Java 9 он поддерживает Latin1 (ISO-8859-1). Однако некоторые операции, такие как charAt(idx), могут быть немного медленнее. С новым дизайном они могут также поддерживать другие кодировки в будущем.

Я написал информационный бюллетень об этом на Информационный бюллетень Java-специалистов .

4 голосов
/ 09 апреля 2012

В OpenJDK 7 (1.7.0_147-icedtea, Ubuntu 11.10) JVM просто отказывает с

Нераспознанная опция VM 'UseCompressedStrings'

, когда JAVA_OPTS (или командная строка) содержит -XX:+UseCompressedStrings.

Кажется, Oracle действительно убрал эту опцию.

...