JVM -XX:+StringCache参数是什么?

20

我最近在阅读 JRE 6 中所有可用的 JVM 参数[Java VM Options],并发现了这个:

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

所以我不确定这个参数是否有效。


2
我认为大多数字符串操作不使用字符串驻留技术。字符串驻留主要由JVM用于存储类文件中的字符串值,并避免由于重复而导致过多的内存消耗。 - akarnokd
很好的问题。Sun文档在这里非常不清楚。然而,有关interning的文档明确指出它仅在特定情况下(字符串字面量)起作用,因此也许JVM参数将该行为应用于更广泛的情况。 - Steve B.
我在OpenJDK源代码中找不到这个选项。你认为这是什么意思? - Michael Myers
2
@mmyers:在OpenJDK中可能不支持。Sun公司表示:“使用-XX指定的选项不稳定,不建议随意使用。这些选项可能会在不事先通知的情况下更改。” - James Van Huis
也许需要进行基准测试? - Gandalf
在我的工作中,我们发现Java 5不能保证对所有字符串进行内部化(当我们开始遇到OutOfMemory异常时)。因此,我们不得不在这里和那里添加.intern()调用。也许在Java 6中可以通过这个选项解决这个问题? - quant_dev
6个回答

6

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


3

-XX:-UseStringCache对我起作用,奇怪。

我的jdk版本应该是1.6.0_22


1

我也无法让上述内容正常工作,但最新的JBB @ spec.org显示它的用途:-XX:-UseStringCache。我将重新运行基准测试以查看它是否有所不同(一个XML重型应用程序)。


1

我也没有找到一个遵守这个设置的JVM;正如评论中所提到的,关于JVM参数的文档质量和有用性是非常糟糕的,然而出于某种原因,JVM供应商似乎认为这是一个能够进行竞争差异化的领域 - 虽然要公平地说,Oracle/Sun绝对是最糟糕的。

无论如何,如果您发现您的应用程序在某些特定领域重复使用少量字符串值,那么使用池化技术进行优化肯定是明智的 - 通过使用String.intern()方法返回内部池值。请注意,您必须使用返回值,这不是原始值的副作用。

与所有性能优化一样,这需要仔细进行度量和测试。它可能会产生显著影响(对我来说确实如此),但如果值池不小,则会降低性能,并且您需要知道字符串值池保存在Perm Gen中,因此使用它会影响内存使用情况、GC等。


1

0

我甚至找不到一个接受这个所谓参数的JVM,所以我想没有什么别的可说的了。


Oracle JRocket 6 ;) http://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/jrdocs/refman/optionXX.html - Christopher Schultz
3
要启用许多奇怪的选项,包括-XX:+UseStringCache,您需要使用-XX:+AggressiveOpts。参考链接:http://mail.openjdk.java.net/pipermail/jdk7-dev/2011-April/002024.html - bestsss

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接