Java JVM-XX:+;StringCache参数?

Java JVM-XX:+;StringCache参数?,java,jvm,jvm-hotspot,jvm-arguments,Java,Jvm,Jvm Hotspot,Jvm Arguments,我最近阅读了JRE 6[]中所有可用的JVM参数,看到了以下内容: -XX:+StringCache:启用常用分配字符串的缓存 现在,我总是觉得Java保留了一个内部(正确的单词?)字符串池,当使用文本进行字符串连接时,它不是创建新对象,而是从这个池中提取它们。有没有人用过这个论点,或者可以解释为什么需要这个论点 编辑:我试图运行一个基准测试,以查看此参数是否有任何影响,但无法让Sun JVM识别它。这与: java version "1.6.0_11" Java(TM) SE Runtim

我最近阅读了JRE 6[]中所有可用的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)

因此,我不确定这个参数是否有效。

我相信当与
-XX:+AggressiveOpts
一起使用时,它可以在创建具有相同文本的
字符串时返回相同的
字符串
对象(当然不是通过
新字符串
)。有一个配置文件阶段,在该阶段建立缓存,并在某个点之后将缓存切换为只读。它在某些基准测试中得到了更高的分数。

我甚至找不到一个JVM能够接受这个假定的参数-所以我想没有什么其他的话要说。

我也不能让上面的内容起作用,但最新的JBB@spec.org显示它的用途:-XX:-UseStringCache。我必须重新运行基准测试,看看它是否有什么不同(一个XML密集型应用程序)。

我还没有找到一个符合此设置的JVM;正如所评论的,关于JVM参数的文档的质量和有用性非常糟糕,但出于某种原因,JVM供应商似乎认为这是一个有竞争优势的领域——尽管公平地说,Oracle/Sun是迄今为止最差的

无论如何,如果您发现您的应用程序在某些特定区域重复使用少量字符串值,那么使用interning肯定是明智的—使用string.intern()方法返回intern pool值。请注意,必须使用返回值,这不会对原始值产生副作用


与所有评测/性能调整一样,这需要通过度量和测试仔细完成。这可能很重要(对我来说一直如此),但如果值池不小,则会降低性能,您需要注意,字符串值池保存在Perm Gen中,因此使用它会影响内存使用、GC等。

-XX:-UseStringCache对我来说很奇怪


我的jdk版本应该是1.6.0_22

从jdk 8.0开始,此选项已被删除。我不清楚有什么可以替代


我认为大多数字符串操作都不使用interning。JVM更倾向于使用interning来存储类文件中的字符串值,并避免由于重复而过度消耗内存。这里的sun文档非常不清楚。然而,关于interning的文档很清楚,它只在特定的环境(字符串文本)下运行,因此JVM arg可能会在更广泛的环境中应用此行为。我在OpenJDK源代码中找不到此选项。你认为这意味着什么?@mmyers:OpenJDK可能不支持它。Sun表示:“使用-XX指定的选项不稳定,不建议随意使用。这些选项可能会在不通知的情况下更改。”也许有一个基准已经准备好了?Oracle JRocket 6;)您需要-XX:+AggressiveOpts来启用许多奇怪的选项,-XX:+UseStringCache包括。以下是参考:
 -XX:+UseStringCache

    Enables caching of commonly allocated strings. This option was removed from JDK 8 
    with no replacement.