作者回复: 2. 即时编译是以方法为单位的。动态编译比较耗时,如果花了大量CPU资源编译出来的机器码运行不了几次,就很浪费了。
3. 机器码越快,需要的编译时间就越长。分层编译是一种折衷的方式,既能够满足部分不那么热的代码能够在短时间内编译完成,也能满足很热的代码能够拥有最好的优化。
作者回复: 就是从执行机器码切换回解释执行,下一篇会详细介绍。
作者回复: 其中一个原因是快速地收集profile,所以会用2 3层编译后的代码,既能够高效运行,也能够收集最终用来4层编译的profile
作者回复: 下篇会讲。主要有分支跳转指令的branch profile,和类型相关指令的type profile。
作者回复: 确切地说,即时编译器将加载进VM中的类的某个方法所对应的byte数组编译为机器码。你也可以理解为从class文件到机器码。
作者回复: 编译结果就是二进制码,下一篇有具体示例。解释执行遇到方法调用时,JVM会判断目标方法是否被编译。如果是,就跳转至编译好的二进制码中。
作者回复: 这里的上下文是在讲编译层次吧?指的是到了1层或者4层之后,就不再就同一个方法触发新的编译请求,除非是OSR编译或者已被去优化
作者回复: 对的,我原稿里是从0开始,可能MD语法给识别错了。
作者回复: 多谢指出!
解释执行是带profiling的。最开始列2 3层时明确标注带profiling,是为了区分1,2,3层。