Аргумент JVM -XX:+StringCache?

Недавно я читал обо всех аргументах JVM, доступных в JRE 6 [Параметры Java VM] и увидел это:

-XX:+StringCache : включает кэширование часто выделяемых строк.

Теперь у меня всегда было впечатление, что Java хранит пул интернированных (правильное слово?) строк, и когда он делает что-то вроде конкатенации строк с литералами, он не создает новые объекты, а извлекает их из этого пула. Кто-нибудь когда-либо использовал этот аргумент или может объяснить, зачем он нужен?

EDIT: я попытался запустить тест, чтобы увидеть, имеет ли этот аргумент какой-либо эффект, и не смог заставить Sun JVM распознать его. Это было с:

java version "1.6.0_11"  
Java(TM) SE Runtime Environment (build 1.6.0_11-b03)
Java HotSpot(TM) Client VM (build 11.0-b16, mixed mode,
sharing)

Так что я не уверен, что этот аргумент вообще работает.


person Gandalf    schedule 26.06.2009    source источник
comment
Я думаю, что большинство строковых операций не используют интернирование. Интернирование скорее используется JVM для хранения строковых значений из файлов классов и предотвращения чрезмерного потребления памяти из-за дубликатов.   -  person akarnokd    schedule 26.06.2009
comment
Отличный вопрос. Солнечные документы здесь очень неясны. Однако в документах по интернированию ясно, что он работает только при определенных обстоятельствах (строковые литералы), поэтому, возможно, аргумент JVM применяет это поведение в более широком наборе обстоятельств.   -  person Steve B.    schedule 26.06.2009
comment
Я не могу найти эту опцию в исходном коде OpenJDK. Как вы думаете, что это значит?   -  person Michael Myers    schedule 26.06.2009
comment
@mmyers: Вероятно, это не поддерживается в OpenJDK. Состояние Sun: параметры, указанные с помощью -XX, нестабильны и не рекомендуются для случайного использования. Эти параметры могут быть изменены без предварительного уведомления.   -  person James Van Huis    schedule 26.06.2009
comment
Возможно, нужен эталон?   -  person Gandalf    schedule 26.06.2009
comment
В моей работе нам понравилось, что Java 5 нельзя доверять для интернирования всех строк, которые она могла бы (когда мы начали сталкиваться с исключениями OutOfMemory). Нам пришлось добавить вызовы .intern() тут и там. Может быть, этот вариант решает эту проблему в Java 6?   -  person quant_dev    schedule 27.06.2009


Ответы (6)


Я считаю, что при использовании с -XX:+AggressiveOpts он позволяет возвращать те же объекты String при создании String с тем же текстом (хотя, конечно, не через new String). Существует фаза профиля, на которой создается кеш, и после определенного момента кеш переключается в режим только для чтения. Он получает более высокие баллы в некоторых тестах.

person Tom Hawtin - tackline    schedule 26.06.2009

-XX:-UseStringCache у меня работает странно.

моя версия jdk должна быть 1.6.0_22

person xshi    schedule 21.11.2010

Я тоже не смог заставить это работать, но последний JBB @ spec.org показывает его использование: -XX:-UseStringCache. Мне придется повторно запустить тесты, чтобы увидеть, имеет ли это значение (тяжелое приложение XML).

person mark d    schedule 22.11.2009

Мне также не удалось найти JVM, которая учитывает этот параметр; как прокомментировано, качество и, следовательно, полезность документации по параметрам JVM ужасны, и все же по какой-то причине кажется, что это область, в которой поставщики JVM видят возможности для конкурентной дифференциации - хотя, честно говоря, Oracle/Sun намного хуже.

В любом случае, если вы обнаружите, что ваше приложение в какой-то конкретной области неоднократно использует небольшое количество строковых значений, тогда определенно разумно использовать интернирование - используя метод String.intern() для возврата значения внутреннего пула. Обратите внимание, что вы должны использовать возвращаемое значение, это не побочный эффект исходного значения.

Как и в случае со всеми настройками профилирования/производительности, это необходимо делать осторожно с метриками и тестированием. Это может быть важно (было для меня), но если пул значений не мал, это снижает производительность, и вам нужно знать, что пул значений String хранится в Perm Gen, и поэтому его использование повлияет на использование памяти, GC и Т. Д.

person Jason    schedule 07.07.2010

Начиная с JDK 8.0, этот параметр был удален. Мне непонятно, что, если что, можно использовать в качестве замены.

http://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html

 -XX:+UseStringCache

    Enables caching of commonly allocated strings. This option was removed from JDK 8 
    with no replacement.
person mjuarez    schedule 25.06.2016

Мне не удалось найти ни одной JVM, которая хотя бы принимает этот предполагаемый аргумент, так что, думаю, больше нечего сказать.

person Gandalf    schedule 29.09.2009
comment
Oracle JRocket 6;) docs.oracle.com/cd /E13150_01/jrockit_jvm/jrockit/jrdocs/refman/ - person Christopher Schultz; 11.06.2012
comment
Вам нужно -XX:+AggressiveOpts, чтобы включить многие странные опции, включая -XX:+UseStringCache. Вот ссылка: mail.openjdk.java.net/ pipermail/jdk7-dev/2011-April/002024.html - person bestsss; 20.03.2013