字符串的Java GC调优

时间:2013-04-09 18:25:20

标签: java string memory memory-management garbage-collection

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

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

当应用程序中的字符串数量非常高时,是否存在特定的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,混合模式)

2 个答案:

答案 0 :(得分:8)

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

并且,与-XX+UseStringCache相关,请查看:JVM -XX:+StringCache argument?

顺便说一下。 Java 7具有很好的功能,允许在使用实习字符串时调整String缓存。请参阅-XX:+PrintSTringTableStatistics-XX:StringTableSize=n。这样,您可以优化String缓存大小。

答案 1 :(得分:0)

Java 8带有新的GC功能-XX:+ UseStringDeduplication。

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