美文网首页
Java学习笔记:JIT

Java学习笔记:JIT

作者: EddieLin | 来源:发表于2018-08-13 03:53 被阅读0次

    背景

    JIT是Just In Time compiler的简称,是JVM的重要一部分。说到JIT就不得不提Java的bytecode。Java的一大优势就是一次编译之后可以运行在所有平台上。Java之所以对平台可以做到neutrual是因为所有的Java代码是首先被编译成bytecode,即我们所熟悉.class文件。然后运行时载入JVM,由JVM来解释(interpret)成机器码(机器码是跟平台相关的)由处理器运行。一般JVM解释bytecoded的操作大概就是看到一串代码就把它变成相对应的机器码。这样按照bytecode一步步执行下去,这样的机械性操作存在一定的可优化空间。

    工作原理

    JIT的基础是compile,这里compile的意思是,不同于普通的interpretation,compiler有更多的代码上下文,一步一步把bytecode进行不同层次的操作,并可以根据上下文来对生成机器码进行优化。例如,一个本地变量被初始化之后没有任何使用。compiler就直接把它给删掉了,在生成的机器码里这个变量不会出现的。其实compile跟优化密不可分,其实compile的过程就是对目前已知的代码特性进行优化。再进一步这里其实非常的intuitive。有个叫code cache的东西,把compile出来的机器码cache起来,下次要用到的时候直接invoke就好了。最后可以对代码进行渐进式的分析-code data profiling。分析代码里面的hotspot,根据分析的结果来决定到底要不要优化以及怎样优化。

    种类

    • client-compiler。这种compiler是主要跑在客户端本地的。特点是使用资源少启动快速。
    • server-compiler。跑在服务器上,因为服务器上程序本身是长时间运行的,而且对启动时间没有严格的要求。那么就可以牺牲启动时间获得深度的优化。
    • tiered-compiler。这种compiler是两者的结合体。在启动之初用client的方案,并且收集数据。随着时间的推移,使用服务器的解决方案并使用之前收集的数据。这样做可以充分利用二者各自的优势,实现最佳的优化结果。
      一般而言,client-compiler会提升大概五到十倍的运行效率。server-compiler比client-compiler提升百分之五十左右,但是需要以更多的资源作为代价。

    Caveat

    JIT其实不是说一定就会有帮助,比如一段代码只被执行了一次,你cache它也是没什么用处的,而且会白白浪费资源。所以JIT在设计的时候大部分是个权衡的过程,根据经验(其实就是data)来决定要不要优化。最终的运行结果也不是一定会提高效率,因为我们需要把compile的cpu和内存的消耗考虑进去。再没有compile的情况下,我们是不需要使用这些资源的。

    常见的优化

    举几个例子来加深理解。其实JIT的核心就是分析代码,优化运行效率。一方面是,代码可能写的不够最优,由JIT代替程序员做一些优化。另一方面是,程序代码本身没问题,但是cpu和内存的操作可以进一步优化,这些程序员并不知道,由JIT来帮程序员做了。

    • 未使用和去重。就是检查一下代码上下文,删一删。
    • loop。这个主要是优化方式是减少程序运行指针的jump操作。优化方案有把loop展开,这样不用跳转顺序执行即可;用if加do while代替while,感觉这样操作只解决了一个特殊情况,且增加了复杂度,并没什么必要。
    • inline。这个操作应该是JIT的核心之一。解决的问题还是指针跳转和机器码重用。具体操作就是把常用的代码段对应机器码直接插入到caller那里。

    相关文章

      网友评论

          本文标题:Java学习笔记:JIT

          本文链接:https://www.haomeiwen.com/subject/totybftx.html