Подтвердить что ты не робот

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

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

-XX: + StringCache: позволяет кэшировать общеупотребительные строки.

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

РЕДАКТИРОВАТЬ: Я попытался запустить бенчмарк, чтобы проверить, не повлиял ли этот аргумент, и не смог заставить 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)

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

Как и в 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.