2009-06-26 5 views
18

Я недавно читал о всех аргументов JVM доступны в JRE 6 [Java VM Options] и увидел это:JVM -XX: + аргумент StringCache?

-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) 

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

+2

Я думаю, что большинство операций со строками не использовать интернирование. Интернационализация скорее используется JVM для хранения строковых значений из файлов классов и избежания чрезмерного потребления памяти из-за дубликатов. – akarnokd

+0

Большой вопрос. Солнечные документы здесь очень неясны. Тем не менее, документы по интернированию ясны, что он работает только при определенных обстоятельствах (строковые литералы), поэтому, возможно, JVM arg применяет это поведение в более широком контексте. –

+0

Я не могу найти этот параметр в источнике OpenJDK. Как вы думаете, что это значит? –

ответ

0

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

+0

Oracle JRocket 6;) http://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/jrdocs/refman/optionXX.html –

+3

Вам нужно -XX: + Агрессивные объекты, чтобы включить множество странных опций, -XX : + UseStringCache в том числе. Вот ссылка: http://mail.openjdk.java.net/pipermail/jdk7-dev/2011-April/002024.html – bestsss

6

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

1

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

1

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

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

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

3

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

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