• godtrue
    2018-08-28
    有点费解,不过还好又明白了一些东西,小结如下:
    1:即时编译-直接将Java字节码编译成机器码,运行在底层硬件之上,这么玩是为了提高代码的执行效率,通俗点就是能使代码跑的更快一些

    2:即时编译的触发点是热点代码,即 即时编译仅针对热点代码来触发,热点代码是通过方法的调用次数或者回边循环的次数来标示的,这里也侧面反映出来即时编译是针对方法块的,有个疑问❓为什么不把所有代码都即时编译一下呢?这样程序的执行效率不是更快吗?为什么还分热点非热点呢?

    3:分层编译的设计也有点奇怪,为什么要这样呢?使用最快的编译代码编译器编译的代码不是更好吗?

    4:解释执行-将Java字节码一段一段的编译成机器码在底层硬件上运行,即时编译是一个相对解释执行而言的概念,它将热点代码先编译成机器码缓存起来,在解释执行字节码的时候判断出已经缓存起来了就不在编译直接获取执行就可以了
    展开

    作者回复: 2. 即时编译是以方法为单位的。动态编译比较耗时,如果花了大量CPU资源编译出来的机器码运行不了几次,就很浪费了。

    3. 机器码越快,需要的编译时间就越长。分层编译是一种折衷的方式,既能够满足部分不那么热的代码能够在短时间内编译完成,也能满足很热的代码能够拥有最好的优化。

    
     24
  • 泰格杨
    2018-08-27
    去优化是啥意思?

    作者回复: 就是从执行机器码切换回解释执行,下一篇会详细介绍。

    
     3
  • 槛外人
    2018-11-06
    为什么一块代码会被2层编译后还会被3、4层编译?不能某一层编译就完了吗?

    作者回复: 其中一个原因是快速地收集profile,所以会用2 3层编译后的代码,既能够高效运行,也能够收集最终用来4层编译的profile

    
     2
  • 大场镇车王
    2018-08-27
    请问带所有profiling是什么意思 所有是个什么概念

    作者回复: 下篇会讲。主要有分支跳转指令的branch profile,和类型相关指令的type profile。

    
     2
  • 逆流的鱼
    2018-11-22
    疑问:即时编译之后的机器码和 native 方法是不是可以等同,这样是不是他俩都是占用jvm的内存和线程资源,而具体的Java程序只是持有机器码方法和native方法的引用,具体Java程序的线程调用时也是再委托给JVM 执行
    
     1
  • Leon Wong
    2018-09-18
    小结一下:

    分层编译的引入是为了让即时编译更具备灵性,使得虚拟机可以根据量化的实际情况以及相应的算法动态选择执行代码的编译路径。分层编译是否开启,决定了编译器的执行阈值是否动态化。

    根据两种不同的计数器(方法调用计数器和循环回边的执行次数计数器),虚拟机有不同的考量,基于方法层面的优化,会使用方法调用计数器作为主要依据,而基于循环层面的,则使用循环回边计数器作为主要依据。

    由此引入了OSR技术,即一种能够替换正在运行函数的栈帧的技术。其目的在于能让执行引擎能在不同的优化层次间来回切换,并以更细粒度(循环)的形式实现之。为了平衡启动性能与峰值性能,OSR可以实现低层次优化往高层次优化的迁移;为了去优化以及方便获取调试信息,OSR可以实现高层次优化往低层次迁移。
    展开
    
     1
  • 杨春鹏
    2018-08-28
    Java中的即时编译器,是不是重新将java代码编译成机器码,并没有使用class文件?

    作者回复: 确切地说,即时编译器将加载进VM中的类的某个方法所对应的byte数组编译为机器码。你也可以理解为从class文件到机器码。

    
     1
  • 郑杰
    2018-08-27
    能说下及时编译的结果是什么样的吗,然后他是怎么跟解释执行一起运行的

    作者回复: 编译结果就是二进制码,下一篇有具体示例。解释执行遇到方法调用时,JVM会判断目标方法是否被编译。如果是,就跳转至编译好的二进制码中。

    
     1
  • longslee
    2019-11-16
    老师你好,请教个问题:有个同事写的程序本身占用JVM空间非常大,然后启动项 JAVA8 指定了 -server ,但是运行一段时间后,就会出现 “C2 编译器 什么空间不足,ReservedCodeCacheSize 什么什么”,按照提示调大以后还是会出现。
    
    
  • leo
    2019-10-03
    解释执行后的机器码不会缓存吗,为什么之后还需要即时编译
    
    
  • neohope
    2019-08-28
    老师您好,在文章最后,我的理解是,从c1或c2到解释运行时,会有内存回收。
    我想问下,当从c1升级到c2后,也会出现“made zombie”将c1代码回收的情况吗?
    此外,是不是解释运行的代码,永远都不会被回收呢?
    谢谢!
    
    
  • Eric
    2019-05-26
    为什么执行效率1层大于2层,2层大于3层???
    
    
  • 我已经设置了昵称
    2019-04-11
    还是有点不懂,即时编译是在程序运行的时候触发?解释编译是指我们普通的java文件被编译class文件的内容?
    
    
  • 未知
    2019-03-23
    每次看都有收获。第三遍。
    
    
  • 哇!怎么这么大个
    2018-12-14
    老师,-XX:+PrintCompilation看到的信息都是及时编译的结果吗,还是说包含了及时编译(C1 C2)和解释编译的结果,有没其他查看代码里即时编译的其他相关文档
    
    
  • Geek_987169
    2018-10-20
    老师,问下,中止状态是什么意思?

    作者回复: 这里的上下文是在讲编译层次吧?指的是到了1层或者4层之后,就不再就同一个方法触发新的编译请求,除非是OSR编译或者已被去优化

    
    
  • 夜行观星
    2018-10-01
    看了分层,还看封面,老师真的用心
    
    
  • vick
    2018-09-26
    请教两个问题:
    1. 解释执行如果发现该方法还没有被编译,是否就是触发即时编译生成二进制码去执行?
    2. 一个方法被即时编译成二进制码后,程序运行期间是否就可以无限循环利用之前编译的机器码去执行了,会有需要再重新编译的情况吗?
    
    
  • Leon Wong
    2018-09-17
    有个小问题,1、4层是终止(接受)状态的前提是,您的五层应该从0开始,到4层结束,但是您现在1层开始,5层结束,那么终止状态应该是2层和5层。

    作者回复: 对的,我原稿里是从0开始,可能MD语法给识别错了。

    
    
  • code-artist
    2018-08-30
    ”前面提到,Java 虚拟机在 0 层、2 层和 3 层执行状态时进行 profiling”
    第0层是解释执行,前面没说带profiling啊? 前面只列出第2,3层带profiling. 这里会不会笔误?

    作者回复: 多谢指出!

    解释执行是带profiling的。最开始列2 3层时明确标注带profiling,是为了区分1,2,3层。

    
    
我们在线,来聊聊吧