Java中针对字符串的GC调优

10

通过对应用程序进行分析,我发现堆上有很多字符串。

在我的情况下,字符串是在堆上创建的,而不是被存储起来并且它们也不是字面量。

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

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

java版本“1.6.0_22”
Java(TM) SE Runtime Environment(build 1.6.0_22-b04)
Java HotSpot(TM) 64-Bit Server VM(build 17.1-b03,mixed mode)


2
根据我的经验,不要去干扰垃圾回收器,它通常已经做得足够好了。 - 0x6C38
1
最重要的是你不要做什么——比如,不要反复将一个字符串“分解”成下一个“标记”和“剩余部分”。这种操作经常出现,会导致应用程序崩溃。 - Hot Licks
2个回答

9

1
澄清一下:当程序终止时,PrintStringTableStatistics会打印出字符串池使用情况的报告。更多信息请参见Mikhail Vorontsov的文章Java 6、7和8中的String.intern - 字符串池 - Basil Bourque

2

Java 8引入了一个新的GC特性-XX:+UseStringDeduplication。

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


2
一个注意事项:您需要使用G1垃圾收集器才能使用“-XX:+UseStringDeduplication”。 - Dmytro Maslenko

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