分析应用程序我发现堆上有很多字符串。
在我的情况下,字符串是在堆上创建的而不是实习的,它们不是文字。
当应用程序中的字符串数量非常高时,是否存在特定的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,混合模式)
答案 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数组值的字符串。假设str1
和str2
具有相同的char [],则GC将str1指向str2的char []。这样,str1的char []可以被垃圾回收并回收内存。而且由于字符串是不可变的,因此没有风险使多个字符串指向相同的char []