20

我最近在阅读 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)

所以我不确定这个论点是否有效。

4

6 回答 6

6

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

于 2009-06-26T16:29:36.330 回答
3

-XX:-UseStringCache 奇怪地为我工作。

我的 jdk 版本应该是 1.6.0_22

于 2010-11-21T08:36:56.833 回答
1

我也无法使上述工作,但最新的 JBB @ spec.org 显示它的用途:-XX:-UseStringCache。我将不得不重新运行基准测试,看看它是否有所作为(一个 XML 繁重的应用程序)。

于 2009-11-22T10:38:28.583 回答
1

我也无法找到尊重此设置的 JVM;正如所评论的那样,围绕 JVM 参数的文档的质量和实用性非常糟糕,但由于某种原因,JVM 供应商似乎看到了竞争差异化的空间——尽管公平地说,Oracle/Sun 是迄今为止最差的。

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

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

于 2010-07-07T14:28:06.537 回答
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.
于 2016-06-25T19:48:42.893 回答
0

我还没有找到一个甚至接受这个假设参数的 JVM——所以我想没有什么好说的了。

于 2009-09-29T20:15:42.507 回答