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

Why is String Deduplication not standard

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

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

-XX:+UseStringDeduplication

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

在另一个 Whosebug 回答中,有人在内存使用优化方面显示了类似的结果。

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

我读到的唯一缺点更像是 CPU 的较小增加,因为 GC 必须多工作一点。

是否还有其他原因不将其用作默认值?

在提问"why was this language decision made"时,我们只能猜测或听听语言设计者公开说了什么。我还没有听到开发人员关于他们为什么这样做的任何评论,所以这里有一些有根据的猜测。

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

就像我说的,如果没有开发者的明确评论,有根据的猜测是退而求其次的事情。