JVM -XX:+ StringCache参数?

时间:2009-06-26 16:14:20

标签: java jvm jvm-hotspot jvm-arguments

我最近在阅读JRE 6 [Java VM Options]中提供的所有JVM参数,并看到了这一点:

  

-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 个答案:

答案 0 :(得分:6)

我相信当与-XX:+AggressiveOpts一起使用时,它可以在创建具有相同文本的String时(但不是通过String)返回相同的new String个对象,当然)。存在一个配置缓存的配置阶段,并且在一个点之后缓存被切换为只读。它在某些基准测试中得分较高。

答案 1 :(得分:3)

-XX:-UseStringCache对我很有用,奇怪的是。

我的jdk版本应为1.6.0_22

答案 2 :(得分:1)

我也无法完成上述工作,但最新的JBB @ spec.org显示了它的用法:-XX:-UseStringCache。我将不得不重新运行基准测试,以确定它是否有所作为(XML重型应用程序)。

答案 3 :(得分:1)

我也找不到一个尊重这个设置的JVM;据评论,围绕JVM参数的文档的质量和有用性是可怕的,但由于某些原因,似乎JVM供应商看到了竞争差异化的空间 - 尽管公平,Oracle / Sun是最糟糕的。

无论如何,如果您发现某个特定区域的应用程序重复使用少量字符串值,那么使用实习是明智的 - 通过使用String.intern()方法返回内部池值。请注意,您必须使用返回值,这不是对原始值的副作用。

与所有分析/性能调整一样,这需要通过指标和测试仔细完成。它可能很重要(对我来说)但是如果值池不小会降低性能并且您需要知道字符串值池保存在Perm Gen中,因此使用它会影响内存使用情况,GC等

答案 4 :(得分:1)

自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.

答案 5 :(得分:0)

我无法找到一个甚至接受这个假设的JVM的JVM - 所以我想没有别的可说的了。