Ответ 1
Мне не удалось найти ни одного JVM, который даже допускает этот предполагаемый аргумент, поэтому я думаю, что еще нечего сказать.
Недавно я читал обо всех аргументах 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)
Поэтому я не уверен, что этот аргумент работает вообще.
Мне не удалось найти ни одного 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() для возврата значения интервала. Обратите внимание, что вы должны использовать возвращаемое значение, это не является побочным эффектом на исходное значение.
Как и во всех настройках профилирования/производительности, это необходимо делать тщательно с метрикой и тестированием. Это может быть значительным (было для меня), но если пул значений невелик, он снижает производительность, и вам нужно знать, что пул значений String хранится в пермском 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.