为什么字符串重复数据删除不是标准的

时间:2019-08-14 08:40:28

标签: java string garbage-collection out-of-memory

我在应用程序中导入时从csv文件创建1000万个对象时遇到问题。进行堆转储时,我发现内存不足发生在达到480万个对象时。

研究解决方案并研究如何改善GC,我偶然发现了VMOption:

-XX:+UseStringDeduplication

使用此方法,我可以在内存不足之前创建780万个对象,这增加了60%以上。堆转储显示,堆中的字符串和byte []最多减少了75%。

在另一个stackoverflow答案中,有人在内存使用优化中显示了相似的结果。 https://stackoverflow.com/a/27953779/10020419

所以我问自己,为什么这不是标准的(我使用Java 11)?

我读到的唯一不足之处是,CPU增加的幅度较小,因为GC必须工作更多。

还有其他原因不将其用作默认设置吗?

1 个答案:

答案 0 :(得分:1)

在询问“为什么要做出这种语言决定”时,我们所能做的就是猜测或听取语言设计师公开说的话。我还没有听到任何有关开发人员为何这样做的评论,所以这是一个有根据的猜测。

  • 在大多数情况下,CPU是比内存更宝贵的资源。
  • 此标志需要G1垃圾收集器,该收集器可能不适用于某些人。如果默认情况下处于打开状态,则可能会切换到另一个GC,然后发现到处都出现OOM错误。

就像我说的那样,没有开发者的明确评论,有根据的猜测是下一个最好的选择。