Java JIT(编译器)

概念

JVM在解释执行字节码的过程中会收集代码块或方法的执行频率用于判断该代码块或方法是否为热点代码,如果被判定为热点代码则这些代码在运行时会被编译并优化成与本地平台相关的可被cpu直接执行的机器码。这种编译过程称为JIT(即时编译),执行JIT的模块被称为JIT编译器。

谁被编译

  • 被多次调用的方法
  • 被多次执行的循环体,编译行为由循环体触发但编译的对象仍然是该循环体涉及到的方法。这种编译方式被称为栈上替换-OSR(由于方法还在执行过程中即方法还在线程栈帧上发生的编译)。

触发条件(热点探测方法)

  • 基于计数器的热点探测(Counter Based Hot Spot Detection)
    虚拟机会为每个方法(或每个代码块)建立计数器,统计执行次数,如果超过阀值那么就是热点代码。缺点是维护计数器开销。
  • 基于采样的热点探测(Sample Based Hot Spot Detection)
    虚拟机会周期性检查各个线程的栈顶,如果某个方法经常出现在栈顶,那么就是热点代码。缺点是不精确。
  • 基于踪迹的热点探测(Trace Based Hot Spot Detection)
    Dalvik中的JIT编译器使用这种方式

HOTSPOT虚拟机(基于计数器的热点探测)

  1. 方法调用计数器(Invocation Counter)
    • 默认触发阈值:在Client模式下是1500次,Server是10000次,可以通过参数-XX:CompileThreshold来设定
    • 当一个方法被调用时会首先检查是否存在被JIT编译过得版本,如果存在则使用此本地代码来执行;如果不存在,则将方法计数器+1,然后判断“方法计数器和回边计数器之和”是否超过阀值,如果是则会向编译器提交一个方法编译请求
    • 默认情况下,执行引擎并不会同步等待上面的编译完成,而是会继续解释执行。当编译完成后,此方法的调用入口地址会被系统自动改写为新的本地代码地址
    • 还有一点,热度是会衰减的,也就是说不是仅仅+,也会-,热度衰减动作是在虚拟机的GC执行时顺便进行的
  2. 回边计数器(Back Edge Counter)
    • 只有执行到大括号”}”时才算+1
    • 默认阀值:Client下13995,Server下10700
    • 它的调用逻辑和方法计数器差不多,只不过遇到回边指令时+1、超过阀值时会提交OSR编译请求以及这里没有热度衰减

编译器(Hotspot JVM)

  • Client Compiler (C1)
    相对于C2编译来说有比较高的启动速度但对编译后的代码优化比较初级,不过相对于解释执行也有一定的执行性能提升。在混合编译模式中,当jvm以client模式启动时使用该编译器。
  • Server Compiler(C2)
    编译优化程度较深,编译后代码执行效率高,但是编译耗时和内存消耗(memory footprint)较高,因此启动速度较慢。比较适用于长时间运行的服务端程序。在混合编译模式中,当jvm以server模式启动时使用该编译器。

编译模式(Hotspot JVM)

  • 混合模式(Mixed Mode)
    HotSpot默认采用解释器和其中一个编译器直接配合的方式工作,使用哪个编译器取决于虚拟机运行的模式,HotSpot会根据自身版本和宿主机器硬件性能自动选择模式,用户也可以使用“-client”或”-server”参数去指定。
  • 解释模式(Interpreted Mode)
    以纯解释执行的方法运行
  • 分层编译(tier)
    jdk1.8及之后默认开启分层编译,如要禁止则在启动参数减伤-XX:-TieredCompilation
    分层编译被启用时,C1和C2编译器会同时工作,同一份代码可能会被多次编译,编译级别逐渐增加。
    五个编译级别:
    • level 0 - 解释执行
    • level 1 - C1编译
    • level 2 - C1编译,需要收集运行时性能数据
    • level 3 - level 2 + MDO
    • level 4 - C2 编译优化

编译过程

编译过程是在后台线程(daemon)中完成的,可以通过参数“-XX:-BackgroundCompilation”来禁止后台编译,但此时执行线程就会同步等待编译完成才会执行程序。

  • C1编译器是一个简单快速的三段式编译器,主要关注“局部性能优化”,放弃许多耗时较长的全局优化手段
    过程:class -> 1. 高级中间代码 -> 2. 低级中间代码 -> 3. 机器代码
  • C2是专门面向服务器应用的编译器,是一个充分优化过的高级编译器,几乎能达到GNU C++编译器使用-O2参数时的优化强度

参考文章 https://www.jianshu.com/p/b1a33c94cd93

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,898评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,401评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,058评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,539评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,382评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,319评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,706评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,370评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,664评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,715评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,476评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,326评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,730评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,003评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,275评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,683评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,877评论 2 335