10

分析应用程序我发现堆上有很多字符串。

在我的情况下,字符串是在堆上创建的,而不是实习生的,它们不是文字。

当应用程序中的字符串数量非常多时,是否需要遵循特定的 GC 调整技术。

我偶然发现了 GC 设置-XX:+UseCompressedStrings 或 -XX+UseStringCache但不确定这会有所帮助。有没有人尝试过这些设置?

Java 版本“1.6.0_22”
Java(TM) SE 运行时环境(构建 1.6.0_22-b04)
Java HotSpot(TM) 64 位服务器 VM(构建 17.1-b03,混合模式)

4

2 回答 2

9

与 相关-XX:+UseCompressedStrings,你应该看看这个问题:Support for Compressed Strings being Dropped in HotSpot JVM?

并且,相关-XX+UseStringCache,看看:JVM -XX:+StringCache 参数?

顺便提一句。Java 7 带有很好的特性,允许在使用内部字符串时调整字符串缓存。见-XX:+PrintSTringTableStatistics-XX:StringTableSize=n。这样您就可以优化字符串缓存大小。

于 2013-04-09T18:31:12.580 回答
1

Java 8 带有一个新的 GC 特性 -XX:+UseStringDeduplication。

启用此功能后,GC 将比较字符串以查找具有相同 char 数组值的字符串。假设str1&str2具有相同的 char[],那么 GC 将使 str1 指向 str2 的 char[]。这样 str1 的 char[] 可以被垃圾收集并回收内存。而且由于字符串是不可变的,所以没有使多个字符串指向同一个 char[] 的风险

于 2020-07-10T16:54:42.447 回答