当前位置: 首页 > 面试题库 >

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

黄俊誉
2023-03-14
问题内容

Java 8引入了可通过启动JVM启用String
Deduplication的功能,该-XX:+UseStringDeduplication选项具有允许通过引用相似String对象而不保留重复项来节省一些内存的选项。当然,它的有效性随程序的使用情况Strings而不同,但取决于使用情况,但我可以肯定地说,对于大多数应用程序(如果不是全部),它可以被认为是有益的,这使我对以下几件事情感到疑惑:

为什么默认情况下不启用它?是由于重复数据删除相关的成本还是仅仅是因为G1GC仍被认为是新的?

是否有(或可能有)您不希望使用重复数据删除的边缘情况?


问题答案:

字符串重复数据删除 可能 有害的情况包括:

  • 有很多字符串,但是重复的可能性非常低:寻找重复项的时间开销和重复数据删除数据结构的空间开销不会得到补偿。
  • 有重复的一个合理的可能性,但大部分串几个GC周期内死亡的1反正。如果无论如何都要对重复数据删除的字符串进行GC处理,重复数据删除的好处就不那么明显了。

(这与不能在第一个GC循环中幸存的字符串无关。对于GC甚至 尝试 去重复它知道是垃圾的字符串都是没有意义的。)

我们只能推测Java团队为什么默认情况下不启用重复数据删除,但是他们可以根据您和我的情况做出合理的决定(即基于证据的决定)。我的理解是,他们可以访问许多大型的实际应用程序进行基准测试/尝试优化的效果。他们也可能在合作伙伴或客户组织中拥有类似的大型代码库,并且对效率有所关注……他们可以征询他们对早期访问版本中的优化是否按预期工作的反馈。

1-这取决于StringDeduplicationAgeThreshold
JVM设置的值。默认为3,这意味着(大约)字符串必须保留3个次要集合或一个主要集合才能进行重复数据删除。但是无论如何,如果对字符串进行了重复数据删除然后不久后发现它无法访问,则不会为该字符串偿还重复数据删除开销。

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

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



 类似资料:
  • 在学习和使用spring-boot之后,我了解了spring-boot ConditionalOnClass的用法和逻辑,我的问题是: < li >为什么“因为这个注释是通过加载类字节码来解析的,所以在这里指定最终可能不在类路径上的类是安全的”。 < li >与此相关的JVM规范在哪里? https://github.com/spring-projects/spring-boot/blob/mas

  • 问题内容: 为什么将某些代码模式(当存在于JVM内部类中时)转换为内在函数,而将相同的模式从我自己的类中调用时却不是。 例: 从Integer中调用bitCount函数时,bitCount(i)将转换为内部函数。但是,当复制到我的班级然后调用时,执行将花费更长的时间。 比较 问题答案: 答案很简单:以这种方式定义内在函数,因为存在一种更快,本机的方法来获取函数结果,并且可以在指定映射的情况下使用该

  • 对于Vaadin10和Vaadin12我得到了相同的结果。spring版本是2.1.2 我期待以下结果 我调用localhost:xxx/=>浏览器询问用户名/密码 我调用localhost:xxx/logout=>浏览器不问密码!

  • 我们知道,JVM同时使用解释器和JIT编译器。JIT编译器将重复的字节码转换为机器码并存储在内存中。现在,当解释器逐行翻译字节码并运行它时,它将跳过已转换并存储在内存中的重复代码的翻译部分,但将直接运行它。从而减少了并发冗余翻译。 那么为什么Java在JVM中使用解释器呢?像JIT这样的编译器可以一次性完成将字节码转换为机器码的整个任务吗?

  • 这是我得到的一个例外。 [proguard]优化...