【问题标题】:Java GC tuning for strings字符串的 Java GC 调优
【发布时间】:2013-04-01 08:06:12
【问题描述】:

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

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

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

【问题讨论】:

  • 根据我的经验,不要乱用 GC,它通常可以做得很好
  • 最重要的是你不做的事情——不要,例如,重复地将一个字符串“分解”成下一个“token”和“the rest”。这种情况经常发生,并且可以让应用程序崩溃。

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


【解决方案1】:

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

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

的风险

【讨论】:

  • 注意:使用-XX:+UseStringDeduplication需要使用G1垃圾回收器。
【解决方案2】:

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

还有,与-XX+UseStringCache相关的,请看:JVM -XX:+StringCache argument?

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

【讨论】:

猜你喜欢
  • 2015-10-24
  • 1970-01-01
  • 2011-08-20
  • 1970-01-01
  • 1970-01-01
  • 2013-03-16
  • 2016-07-19
  • 2011-02-16
  • 1970-01-01
相关资源
最近更新 更多