我正在阅读Java HotSpot VM Options。我见过一些有趣的 VM 切换,主要与字符串有关——这对我来说很有价值,因为我的应用程序正在执行一些繁重的字符串操作。那些是:
-XX:+UseStringCache
-XX:+UseCompressedStrings
-XX:+OptimizeStringConcat
我想知道 - 这些开关是否默认打开?使用它们的实际经验是什么?他们有什么不同吗?
我正在阅读Java HotSpot VM Options。我见过一些有趣的 VM 切换,主要与字符串有关——这对我来说很有价值,因为我的应用程序正在执行一些繁重的字符串操作。那些是:
-XX:+UseStringCache
-XX:+UseCompressedStrings
-XX:+OptimizeStringConcat
我想知道 - 这些开关是否默认打开?使用它们的实际经验是什么?他们有什么不同吗?
要检查默认值,请使用
java -XX:+PrintFlagsFinal
要准确找到您想要的,您可以
java -XX:+PrintFlagsFinal | grep UseCompressedStrings
我知道它-XX:+UseCompressedStrings
在 Java 7 中被放弃了,因为它太难支持了。
对于 Java 7 更新 40
$ java -XX:+PrintFlagsFinal 2>&1 | grep UseStringCache
bool UseStringCache = false {product}
$ java -XX:+PrintFlagsFinal 2>&1 | grep OptimizeStringConcat
bool OptimizeStringConcat = true {C2 product}
考虑到 String 的性能,看看-XX:+PrintStringTableStatistics
and -XX:StringTableSize=
。Java 7 带有很好的特性,允许在使用内部字符串时调整字符串缓存。这样您就可以优化字符串缓存大小。
并且,一个相关的字符串性能 Q/A:Java GC 字符串调优
根据我使用 PrintFlagsFinal 对 JDK6u21、JDK7u21 和 JDK8u191 的检查,我们有以下值:
JDK6u21 JDK7u21 JDK8u191
-XX:+UseStringCache false false <unsupported>
-XX:+UseCompressedStrings false <unsupported> <unsupported>
-XX:+OptimizeStringConcat false true true