JVM JIT

大学时写的的文章,当时文章水平略差,大家见谅。

JIT Just In Time,JVM中的一种即时编译技术,目的是为了提升程序的运行效率。

先说一下前提,Java 是一种解释型语言,我们写完Java 代码后,编译器会把Java 编译为对应的字节码,然后由JVM解释执行。但是解释执行,每次执行时都需要对应的去逐条翻译、逐条执行,执行效率比较低下。

后来为了处理 慢 这个问题,JVM 引进了JIT。

JVM的对于JIT使用的运作流程是这样的:

首先我们的Java代码由javac 等编译器 编译为JVM可执行的字节码(ByteCode),然后JVM 会判断这段代码是否为热点代码,如果是那么使用JIT技术,如果不是那么解释执行,最后变成机器码,由操作系统分配然后CPU具体执行。

这里有具体的JVM参数能够调节下述流程:

-Xint全部使用字节码解释执行,这个是最慢的,慢的惊人,通常要比其他方式慢一个数量级左右。

-Xcomp相反,全部被编译成机器码执行,速度是很快的,但是存在一个缺陷,-Xcomp的策略过于简单。

-Xmixed,是一种自适应的方式,有的地方解释执行,有的地方编译执行,具体的策略要依据profile的统计分析来判断。

image.png

那具体的JIT操作,就是并非由我们的JVM去解释执行字节码,而是将得到的字节码直接编译成可执行的机器码,之后再调用、执行这一块的代码的时候直接使用机器码就ok了,省去了额外的编译或者解释。

具体的哪一类去解释,这是有具体的热点代码的判断策略来决定的。最常见的类型 比如循环体,高频执行,还有比如一些热点函数。

那既然这样快,为什么不全都去编译执行呢,因为我们程序中有挺大一部分调用频次比较低,并且一次编译的花销要比解释执行大不少,还会有额外的操作。这时去使用JIT就得不偿失了。

除了上述主要的特点外,JVM还有一个很棒的特性叫做自优化,当JIT对一块代码结构非常了解后,会做出具体的优化策略(比如何时从寄存器取值、何时从主存取值)

具体对于我们应该怎么使用或者说利用呢,下面马上介绍

如何选择:

JIT在运行时分为两种模式,客户端&服务端模式(-client、-server),这两种区别还是很大的。-client时会采用一个叫做C1的轻量级编译器,-server时会采用一个叫做C2的重量级编译器。-server 相对于 -client来说编译更彻底,性能也更好。在我们查看电脑的Java会有一个-server或者-client的标示。

这一块需要我们去调配JVM,选择适合我们的编译模式。具体的指定方式:-cient,-server 或是-xx:+TieredCompilation,长时运行就选择server多层编译方式,如果仅仅是临时执行或者短暂执行去选择-client。

如何调优过程:

优化代码缓存相关。

当JVM编译代码时会将汇编指令集保存在代码缓存中,并且这个缓存大小是固定的,当刚开始的时候把这块缓存填满后JVM后续除已缓存的代码外,只能通过解释来执行了。

这其实就是选择-server或者-client 的主要依据了,因为-server方式对热点代码要求会比较高,而-client相对来说就比较简单了对应的会产生大量的热点代码。

除此之外,默认的缓存大小总是少得可怜,我们在运行一些大的、长时项目是时需要适当的调大这一块区域。

-XX:InitialCodeCacheSize=N 修改默认缓存大小

–XX:ReservedCodeCacheSize=N 修改最大缓存大小。

编译阀值相关。

在JVM中存在这么两类计数器,一种是函数的调用次数,另一种是方法中循环被回弹的次数。(这里敲下黑板,回弹低点可不仅仅只有循环体结束处,还有可能是continue)

这两个技术相关的,就是用来判断是否达到标准去编译它。如果有,排队编译。

如果一个函数调用过程中,或者一个循环体执行过程中,虽然马上还要调用或者还会继续下一次循环,这时候也是会触发一个编译操作。将编译的结果替换当前执行的部分,这个操作叫做栈上替换。

具体使用:

-XX:CompileThreshold=Nflag 指定需要的编译次数,-client 默认应该是1500,-server为10000。这东西的修改需要一点点试调。

如果想监控或者观察JVM的编译过程,可以指定-XX:+PrintCompilation,来打印JVM中的编译过程,这一块的信息通过jstat就能看到

jstat -compiler 进称id

编译过程很直观,显然是异步的,具体的数量通过-XX:CICompilerCount=N 调整。

具体的场景,需要具体的调节,没有最好的,只有最合适的。

其实 除了官方的HotSpot JVM,IBM的J9 JVM也是非常值得看一看,对了还有一个叫做classic JVM。

比较着去学习,感觉效果更明显~

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

推荐阅读更多精彩内容

  • Java 虚拟机(Java virtual machine,JVM)是运行 Java 程序必不可少的机制。JVM实...
    Rick617阅读 856评论 0 0
  • javac做了些什么? 说白了,javac就是一个编译器;编译器就是把一种语言规矩转换成另一种语言规矩,也就是将对...
    西部小笼包阅读 4,828评论 0 4
  • java编译器,java解释器 1.java程序是一种可跨平台执行的语言,之所以可以跨平台,是因为jvm的存在,J...
    rabbit_coding阅读 6,988评论 2 18
  • JVM:--java虚拟机(JVM)JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机...
    YangEvol阅读 1,229评论 0 1
  • 1 编译简介 根据完成任务不同,可以将编译器的组成部分划分为前端(Front End)与后端(Back End)。...
    QuinnSun阅读 772评论 0 1