【问题标题】:Why is String Deduplication not standard [duplicate]为什么字符串重复数据删除不标准[重复]
【发布时间】:2019-08-14 08:40:28
【问题描述】:

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

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

-XX:+UseStringDeduplication

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

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

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

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

还有什么其他理由不使用它作为默认值吗?

【问题讨论】:

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


【解决方案1】:

当问“为什么做出这个语言决定”时,我们所能做的就是猜测或倾听语言设计者公开所说的话。我没有听到开发人员对他们为什么这样做的任何评论,所以这里有一个有根据的猜测。

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

就像我说的那样,如果没有来自开发人员的明确 cmets,有根据的猜测是次优的。

【讨论】:

  • 好的,谢谢。问题不是“为什么不是这个标准”,而是“我可以使用这个还是有我没有发现的问题?” AlexH 在评论中提供的链接回答了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-16
  • 1970-01-01
  • 2017-02-15
  • 1970-01-01
  • 2023-01-21
  • 2020-03-30
相关资源
最近更新 更多