java - 为什么/何时不想在 JVM 中启用 Java 8 UseStringDeduplication?

标签 java performance optimization java-8

Java 8 引入了字符串重复数据删除,可以通过使用 -XX:+UseStringDeduplication 选项启动 JVM 来启用,允许通过引用类似的 String 对象而不是保留重复项来节省一些内存.当然,它的有效性因程序而异,具体取决于 Strings 的利用率,但我认为可以肯定地说,总的来说,它可以被认为对大多数应用程序(如果不是全部)有益,这让我想知道很少有事情:

为什么默认不启用?是因为与重复数据删除相关的成本,还是仅仅因为 G1GC 仍然被认为是新的?

是否存在(或可能存在)您不想使用重复数据删除的极端情况?

最佳答案

字符串去重可能有害的情况包括:

  • 字符串很多,但重复的概率很低:查找重复的时间开销和重复数据结构的空间开销不会得到补偿。
  • 存在重复的合理概率,但大多数字符串无论如何都会在几个 GC 周期内死亡1。如果重复数据删除后的字符串很快就会被 GC 处理,那么重复数据删除的好处就会减少。

    (这与无法在第一个 GC 循环中存活的字符串无关。GC 甚至 尝试 对它知道是垃圾的字符串进行重复数据删除是没有意义的。)

我们只能推测为什么 Java 团队没有默认启用重复数据删除功能,但他们可以更好地对此做出理性(即基于证据)的决定,你和我。我的理解是他们可以访问许多大型现实世界应用程序来进行基准测试/尝试优化的效果。他们还可能在合作伙伴或客户组织中有类似的大型代码库和对效率的担忧......他们可以向他们询问有关早期访问版本中的优化是否按预期工作的反馈。

1 - 这取决于 StringDeduplicationAgeThreshold 的值 JVM 设置。这默认为 3,这意味着(大致)一个字符串必须在 3 个次要集合或一个主要集合中存活下来,才能考虑进行重复数据删除。但无论如何,如果一个字符串被重复数据删除后不久发现无法访问,则该字符串的重复数据删除开销将不会得到补偿。


如果您问何时应该考虑启用重复数据删除,我的建议是尝试一下,看看它是否对每个应用程序有帮助。但是您需要进行一些应用程序级别的基准测试(这需要付出努力!)以确保重复数据删除是有益的......

仔细阅读JEP 192还可以帮助您了解这些问题,并判断它们如何适用于您的 Java 应用程序。

关于java - 为什么/何时不想在 JVM 中启用 Java 8 UseStringDeduplication?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42080648/

相关文章:

performance - Golang - 传递和返回变量的最佳实践

python - 用于文件操作的 R 或 Python

python - 提高python中函数的性能

opengl - 如何在游戏循环中计算直到最后一刻

Java:比 String(byte[]) 更快的替代品

python - 优化 Python for 循环

java - 将存储为对象的字符串属性的 json 作为 JSON 对象发送到客户端

java 9 模块,NoClassDefFoundError : java. sql.Date

java - 在 session 中保存 - Liferay Portlet

java - openjdk中的原生linux方法在哪里?