Вопрос

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

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

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

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

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

Это было полезно?

Решение 6

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

Другие советы

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

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

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

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

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

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

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

Начиная с 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.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top