关于java:什么是JIT怎么优化

38次阅读

共计 1875 个字符,预计需要花费 5 分钟才能阅读完成。

什么是 JIT

JIT 是 just in time 的缩写, 也就是即时编译编译器。

在运行时 JIT 会把翻译过的机器码保存起来,以备下次应用,因而从实践上来说,采纳该 JIT 技术能够靠近以前纯编译技术。上面咱们看看,JIT 的工作过程。

备注:寄存器的应用是编译器的一个十分广泛的优化。寄存器的速度比主存快很多。

怎么优化 JIT 编译

  • 高级调优:客户模式或服务器模式
  • 中级编译器调优(-cient,-server 或是 -xx:+TieredCompilation)

    • 优化代码缓存 (–XX:ReservedCodeCacheSize)
    • 编译阈值 (-XX:CompileThreshold)
    • 查看编译过程 (XX:+PrintCompilation)
  • 高级编译器调优

    • 编译线程 (-XX:CICompilerCount)

从优化的角度讲,最简略的抉择就是应用 server 编译器的分层编译技术,这将解决大概 90% 左右的与编译器间接相干的性能问题。最初,请保障代码缓存的大小设置的足够大,这样编译器将会提供最高的编译性能。

HotSpot 中的 JIT 编译器

1.1 编译器和解释器

HotSpot 中有编译器和解释器并存。

HotSpot 中内置两个 JIT 编译器:

JVM 依据本身版本和机器硬件性能主动抉择

  • Client Compiler,简称 C1,-client 参数强制
  • Server Compiler,简称 C2,-server 参数强制

解释器和编译器搭配应用成为混合模式(Mixed Mode)

  • 用 -Xint 参数强制 JVM 运行与解释模式,全副用解释形式,编译器不染指
  • 用 -Xcomp 强制 JVM 运行于编译模式,优先采纳编译形式

分层编译:依据比那一起编译,优化的规模耗时,划分出不同的编译档次

  • 第 0 层,程序解释执行,解释器不开启性能监测性能,触发第一层编译
  • 第 1 层,也叫 C1 编译,将字节码编译为本地代码,进行简略,牢靠的优化,如有必要,退出性能监测的逻辑
  • 第 2 层(或者 2 层以上),也叫 C2 编译,将字节码比那一位本地代码,但会开启一些编译耗时较长的优化,甚至依据性能监控信息进行一些不牢靠的激进优化

分层编译后,Client Compiler 和 Server Compiler 将会同时工作,代码可能会被屡次编译,用 Client 取得更高的编译速度,用 Server 取得更好的编译品质,解释执行的时候无需收集性能监控信息

1.2 编译对象和触发条件

热点代码有两类:

  • 屡次调用的办法
  • 屡次执行的循环体,实际上也会以整个办法作为编译对象

判断热点的办法次要有两种:

基于采样的热点探测(Sample Based Hot Spot Detection):周期性查看各个线程的栈顶,发现某个(某些)办法经常出现在栈顶,就是热点办法
有点简略高效,能够获取办法调用关系(将调用堆栈开展即可)
毛病是很难准确确认办法热度,容易受到线程阻塞等外界因素影响
基于计数器的热点探测(Counter Based Hot Spot Detection):为每个办法(甚至代码块)建设计数器,统计办法调用次数,如果执行超过阈值就认为是热点办法。毛病是实现较为艰难。长处是后果更准确。

基于计数器的探测:
Client 模式下默认 1500 次,Server 下默认 10000 次,依据参数 -XX:CompileThreshold 设定。
调用一个办法,先查看是否存在 JIT 编译版本本地代码,存在优先应用本地代码,不存在将计数器加 1。而后判断调用计数器和回边计数器之和是否大于阈值,如果超过,用 JIT 编译器提交编译申请。JIT 编译实现后办法调用入口就被零碎换成新的。下次调用已编译版本。
计数器热度衰减(Counter Decay 超过肯定的工夫限度,办法的调用次数仍未达到阈值,办法计数器缩小一半。在垃圾收集期间执行,用 -UseCounterDecay 来敞开,以统计相对次数。用 -XX:CounterHalfLifeTime 设置半半衰周期。
回边计数器:统计办法中办法体代码执行的次数,在字节码中遇到管制流向后跳动的指令成为回边(Back Edge)。
回边计数器阈值能够用 -XX:OnStackReplacePercentage 来间接调整。
回边计数器没有热度衰减过程。

1.3 编译过程

JVM 默认状况下对于即时编译申请在编译实现之前,都依照解释形式执行,编译动作在后盾线程执行

参数 -XX:-BackgroundCompilation 禁止后盾编译,此时编译申请会期待,直到编译实现后间接执行本地代码

  • Client Compiler:关注局部优化,简略疾速,放弃耗时的长时优化
  • Server Compiler:面向服务端,高性能,简单,较迟缓

本文由猿必过 YBG 公布

正文完
 0