我是靠谱客的博主 沉默月饼,最近开发中收集的这篇文章主要介绍【JVM笔记】热点代码及探测方式JIT编译器热点代码及探测方式的选择热度衰减,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

JIT编译器

热点代码及探测方式的选择

方法调用计数器

回边计数器

热度衰减


JIT编译器

Java 语言的 “编译期” 其实是一段 “不确定” 的操作过程,因为它可能是指一个前端编译器(编译器的前端). java 文件转变为 . class 文件的过程

也有可能是指虚拟机的后端运行期编译器(JIT 编译器)把字节码转变成机器码的过程

还可能是指使用静态提前编译器(AOT 编译器)直接把 . java 文件编译成本地机器码的过程

热点代码及探测方式的选择

当然是否需要启动 JIT 编译器将字节码直接编译为对应平台的本地机器指令,则需要根据代码被调用执行的频率而定。关于那些需要被编译为本地代码的字节码,也被称之为 “热点代码”,JIT 编译器在运行时会针对那些频繁被调用的 “热点代码” 做出深度优化,将其直接编译为对应平台的本地机器指令,以此提升 Java 程序的执行性能

一个被多次调用的方法,或者是一个方法体内部循环次数较多的循环体都可以被称之为 “热点代码”,因此都可以通过 JIT 编译器编译为本地机器指令。由于这种编译方式发生在方法的执行过程中,因此也被称之为栈上替换,或简称为 OSR (On StackReplacement)编译

一个方法究竟要被调用多少次,或者一个循环体究竟需要执行多少次循环才可以达到这个标准?必然需要一个明确的阚值, JIT 编译器才会将这些 “热点代码” 编译为本地机器指令执行。这里主要依靠热点探测功能

目前 HotSpot VM 所采用的热点探测方式是基于计数器的热点探测

采用基于计数器的热点探测,HotSpot VM 将会为每一个方法都建立 2 个不同类型的计数器,分别为方法调用计数器( Invocation Counter)和回边计数器(Back Edge Counter))

方法调用计数器用于统计方法的调用次数

回边计数器则用于统计循环体执行的循环次数

方法调用计数器

这个计数器就用于统计方法被调用的次数,它的默认阈值在 Client 模式下是1500 次,在 Server 模式下是10000 次。超过这个阈值,就会触发 JIT 编译

这个阈值可以通过虚拟机参数 -XX : CompileThreshold 来人为设定

当一个方法被调用时,会先检查该方法是否存在被 JIT 编译过的版本,如果存在,则优先使用编译后的本地代码来执行。如果不存在已被编译过的版本,则将此方法的调用计数器值加 1,然后判断方法调用计数器与回边计数器值之和是否超过方法调用计数器的阈值。如果已超过阈值,那么将会向即时编译器提交一个该方法的代码编译请求

回边计数器

它的作用是统计一个方法中循环体代码执行的次数,在字节码中遇到控制流向后跳转的指令称为 “回边”(Back Edge)。显然,建立回边计数器统计的目的就是为了触发 OSR 编译

热度衰减

如果不做任何设置,方法调用计数器统计的并不是方法被调用的绝对次数,而是一个相对的执行频率,即一段时间之内方法被调用的次数。当超过一定的时间限度,如果方法的调用次数仍然不足以让它提交给即时编译器编译,那这个方法的调用计数器就会被减少一半,这个过程称为方法调用计数器热度的衰减(Counter Decay),而这段时间就称为此方法统计的半衰周期(Counter Half Life Time)

进行热度衰减的动作是在虚拟机进行垃圾收集时顺便进行的,可以使用虚拟机参数

-XX: -UseCounterDecay 来关闭热度衰减,让方法计数器统计方法调用的绝对次数,这样,只要系统运行时间足够长,绝大部分方法都会被编译成本地代码

另外,可以使用 -XX:CounterHalfLifeTime 参数设置半衰周期的时间,单位是秒

最后

以上就是沉默月饼为你收集整理的【JVM笔记】热点代码及探测方式JIT编译器热点代码及探测方式的选择热度衰减的全部内容,希望文章能够帮你解决【JVM笔记】热点代码及探测方式JIT编译器热点代码及探测方式的选择热度衰减所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部