16 | 即时编译(上)
该思维导图由 AI 生成,仅供参考
分层编译模式
- 深入了解
- 翻译
- 解释
- 总结
Java虚拟机即时编译技术是本文的重点,详细介绍了HotSpot虚拟机中的分层编译模式,包括C1、C2和Graal等即时编译器。文章讲解了分层编译的五个执行状态,不同层级的性能特点,以及即时编译的触发条件。此外,还介绍了启用分层编译时的动态调整阈值系统和编译线程分配规则。另外,OSR编译和实践环节也得到了详细解释。总的来说,本文内容涵盖了即时编译的原理、触发条件和优化策略,对于想深入了解Java虚拟机即时编译技术的读者具有很高的参考价值。
《深入拆解 Java 虚拟机》,新⼈⾸单¥59
全部留言(29)
- 最新
- 精选
- 钱有点费解,不过还好又明白了一些东西,小结如下: 1:即时编译-直接将Java字节码编译成机器码,运行在底层硬件之上,这么玩是为了提高代码的执行效率,通俗点就是能使代码跑的更快一些 2:即时编译的触发点是热点代码,即 即时编译仅针对热点代码来触发,热点代码是通过方法的调用次数或者回边循环的次数来标示的,这里也侧面反映出来即时编译是针对方法块的,有个疑问❓为什么不把所有代码都即时编译一下呢?这样程序的执行效率不是更快吗?为什么还分热点非热点呢? 3:分层编译的设计也有点奇怪,为什么要这样呢?使用最快的编译代码编译器编译的代码不是更好吗? 4:解释执行-将Java字节码一段一段的编译成机器码在底层硬件上运行,即时编译是一个相对解释执行而言的概念,它将热点代码先编译成机器码缓存起来,在解释执行字节码的时候判断出已经缓存起来了就不在编译直接获取执行就可以了
作者回复: 2. 即时编译是以方法为单位的。动态编译比较耗时,如果花了大量CPU资源编译出来的机器码运行不了几次,就很浪费了。 3. 机器码越快,需要的编译时间就越长。分层编译是一种折衷的方式,既能够满足部分不那么热的代码能够在短时间内编译完成,也能满足很热的代码能够拥有最好的优化。
2018-08-2851 - 槛外人为什么一块代码会被2层编译后还会被3、4层编译?不能某一层编译就完了吗?
作者回复: 其中一个原因是快速地收集profile,所以会用2 3层编译后的代码,既能够高效运行,也能够收集最终用来4层编译的profile
2018-11-068 - 泰格杨去优化是啥意思?
作者回复: 就是从执行机器码切换回解释执行,下一篇会详细介绍。
2018-08-277 - 杨春鹏Java中的即时编译器,是不是重新将java代码编译成机器码,并没有使用class文件?
作者回复: 确切地说,即时编译器将加载进VM中的类的某个方法所对应的byte数组编译为机器码。你也可以理解为从class文件到机器码。
2018-08-285 - 郑杰能说下及时编译的结果是什么样的吗,然后他是怎么跟解释执行一起运行的
作者回复: 编译结果就是二进制码,下一篇有具体示例。解释执行遇到方法调用时,JVM会判断目标方法是否被编译。如果是,就跳转至编译好的二进制码中。
2018-08-275 - Leon Wong有个小问题,1、4层是终止(接受)状态的前提是,您的五层应该从0开始,到4层结束,但是您现在1层开始,5层结束,那么终止状态应该是2层和5层。
作者回复: 对的,我原稿里是从0开始,可能MD语法给识别错了。
2018-09-1743 - 大场镇车王请问带所有profiling是什么意思 所有是个什么概念
作者回复: 下篇会讲。主要有分支跳转指令的branch profile,和类型相关指令的type profile。
2018-08-273 - 公号-技术夜未眠请问即时编译的对象是方法级还是语句块级?
作者回复: 一般都是方法级。 OSR编译会拿热循环作为编译对象。
2018-08-273 - Geek_987169老师,问下,中止状态是什么意思?
作者回复: 这里的上下文是在讲编译层次吧?指的是到了1层或者4层之后,就不再就同一个方法触发新的编译请求,除非是OSR编译或者已被去优化
2018-10-201 - 魏春河我记得前面提到过CompileThreshold 默认是15,今天怎么成1500了?
作者回复: 15应该是反射调用从本地实现切换为动态实现吧。这里的1500是即时编译的。
2018-08-281