我在读《深入Scala》这本书的时候,提到HotSpot编译器有几个重要的特性,其中之一就是“动态去优化”:
它是确定优化是否有效的能力not,事实上,提高性能并撤消该优化,允许应用其他优化
看来HotSpot会尝试各种“优化”,并选择其中最好的一种。
但我不太明白。这里的“优化”都是HotSpot提供的吗?我的意思是程序员经常尝试用一些技巧来优化代码,HotSpot 会处理它们吗?
HotSpot 是否会尝试一些常见的“优化”?
Oracle 提供了一个(相当简洁)JVM 应用的性能技术的总结。它解释说:
去优化是将优化的堆栈帧更改为
一个未经优化的。对于编译方法来说,它也是
丢弃具有无效乐观优化的代码的过程,
并用优化程度较低、更健壮的代码替换它。一个方法可以在
原理被去优化数十次。
总结一下,去优化的原因如下:
- 编译器可能会删除未采用的分支,并在曾经采用的情况下进行取消优化。
- 同样,对于历史上从未失败过的低级安全检查。
- 如果调用站点或转换遇到意外类型,编译器将取消优化。
- 如果加载的类使早期的类层次结构分析无效,则任何线程中的任何受影响的方法激活都将被强制
到安全点并取消优化。
- 这种间接的去优化是由依赖系统调节的。如果编译器做出未经检查的假设,它必须注册一个
可检查的依赖关系。 (例如,该类 Foo 没有子类,或者
方法 Foo.bar 没有覆盖。)
就我个人而言,我发现这个博客条目关于微基准测试的文章非常可读,其中还涵盖了 HotSpot VM 上的优化和反优化主题。另外,我可以推荐通读本演示文稿.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)