Java 8引入了可通过启动JVM启用String
Deduplication的功能,该-XX:+UseStringDeduplication
选项具有允许通过引用相似String
对象而不保留重复项来节省一些内存的选项。当然,它的有效性随程序的使用情况Strings
而不同,但取决于使用情况,但我可以肯定地说,对于大多数应用程序(如果不是全部),它可以被认为是有益的,这使我对以下几件事情感到疑惑:
为什么默认情况下不启用它?是由于重复数据删除相关的成本还是仅仅是因为G1GC仍被认为是新的?
是否有(或可能有)您不希望使用重复数据删除的边缘情况?
字符串重复数据删除 可能 有害的情况包括:
(这与不能在第一个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]优化...