字符串重复数据删除 可能 有害的情况包括:
- 有很多字符串,但是重复的可能性非常低:寻找重复项的时间开销和重复数据删除数据结构的空间开销不会得到补偿。
- 有重复的一个合理的可能性,但大部分串几个GC周期内死亡的1反正。如果无论如何都要对重复数据删除的字符串进行GC处理,重复数据删除的好处就不那么明显了。
(这与不能在第一个GC循环中幸存的字符串无关。对于GC甚至 尝试 去重复它知道是垃圾的字符串都是没有意义的。)
我们只能推测Java团队为什么默认情况下不启用重复数据删除,但是他们可以根据您和我的情况做出合理的决定(即基于证据的决定)。我的理解是,他们可以访问许多大型的实际应用程序进行基准测试/尝试优化的效果。他们也可能在合作伙伴或客户组织中拥有类似的大型代码库,并且对效率有所关注……他们可以征询他们对早期访问版本中的优化是否按预期工作的反馈。
1-这取决于
StringDeduplicationAgeThreshold
JVM设置的值。默认为3,这意味着(大约)字符串必须保留3个次要集合或一个主要集合才能进行重复数据删除。但是无论如何,如果对字符串进行了重复数据删除然后不久后发现它无法访问,则不会为该字符串偿还重复数据删除开销。
如果您询问何时应该考虑启用重复数据删除,我的建议是尝试一下,看看它是否 对每个应用程序都有
帮助。但是您需要进行一些应用程序级基准测试(这很费力!),以确保重复数据删除是有益的…
仔细阅读JEP 192还可以帮助您理解问题,并判断它们如何应用于Java应用程序。



