JVM -XX: + аргумент StringCache? - PullRequest
19 голосов
/ 26 июня 2009

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

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

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

РЕДАКТИРОВАТЬ: Я попытался выполнить тест, чтобы увидеть, имел ли этот аргумент какой-либо эффект и не смог заставить JVM Sun распознать его. Это было с:

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)

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

Ответы [ 6 ]

6 голосов
/ 26 июня 2009

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

3 голосов
/ 21 ноября 2010

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

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

1 голос
/ 25 июня 2016

Начиная с 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.
1 голос
/ 07 июля 2010

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

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

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

1 голос
/ 22 ноября 2009

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

0 голосов
/ 30 сентября 2009

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

...