JVM调优之JIT编译

从我们编写的java文件到机器上跑起来的系统,中间经历了什么呢?

首先java文件经过类编译成为.class文件,class文件经过类加载加载到虚拟机中,在虚拟机中经过链接、初始化而

成为字节码,最后经过运行时编译成为机器码

类编译使用JDK自带的javac工具完成编译即可成为.class文件,class文件可以分为几项信息:

魔数,版本号,常量池,字段表集合,方法表集合,我们重点关注常量池和方法表集合,常量池主要是

类文件里面的字面常量及符号引用,字面常量主要是字符串常量、final常量、基本类型例如-127-128的整型,

符号引用主要是类和接口的全限定名、类引用、方法引用及成员变量引用

方法表集合主要是方法的字节码、访问权限public private等等、方法名索引、jvm指令、属性集合等等

类加载过程就是一个类被创建了,然后虚拟机以前没加载过,那么就会通过类加载器加载进来,类的信息会存放在JVM的方法区里面

类链接过程呢,又分为三部分:验证、准备、解析

验证阶段:就是jvm想执行java文件,那么你这个文件我得先验证一些你是否符合jvm规范、java规范

准备阶段:试想一些,我们这是在载入一个类,那么最优先的,肯定是属于这个类的直接属性对不对,那就是静态变量啊,

然后我们可以把静态变量分成两种,一种就是单纯的静态变量,另一种就是带final的静态变量啊,这两个的区别是什么呢?

带final的,说明他不可变了,那么我们这时候就可以给他分配内存空间了并且可以直接赋值了,而静态变量呢,先给他内存空间

就好了,赋值先赋值成类型的初始值

解析阶段:我们刚刚上面说过了,我们在方法区里面放了类的信息嘛,然后我们只是给静态属性分配了内存空间而已,而我们方法区

里面那些符号引用并还没有处理呢,所以这个阶段就是把那些符号引用变成直接引用,就是把他们变为 jvm能识别调用的内存地址或者指针

初始化阶段:这个阶段,jvm会执行一个clinit的方法,就是我们的静态代码块、静态方法、静态变量赋值语句收集在一起,然后执行我们代码

的赋值,而不是类属性的初始值了,如果你这个类有继承关系的话,jvm会先执行父类的再执行子类的,老子优先,很合理。然后因为每个类

都是独一无二的只有一个,所以得保证并发问题,保证只有一个线程完成这个工作

至此为止,我们的java文件就变成在字节码运行在jvm里面了,剩下的工作就是变成机器码在机器里面执行了,在这过程中,jvm还藏着

一层编译,就是即时编译

即时编译:虚拟机中的字节码是由解释器转变为机器码的。这时想一下我们开发过程中碰到的场景,就是经常访问的数据我们肯定会加一层

缓存,以便加速访问。那么jvm也一样,虚拟机发现有一些代码或者代码块运行的很频繁,那么可想而知,我们可以做些特殊处理以便加速

访问,所以在JIT编译器会把这些代码编译成机器码并做相关优化然后存在内存里,怎么区分哪些代码是热点代码呢?

热点探测:就是jvm会给每个方法放两个计数器,一个是方法调用计数器,一个是回边计数器。方法调用计数器就是如同他的命名一样,就是

统计方法的执行次数,达到设定的阈值便认为是热点代码,或者是当配置的阈值失效时,根据当前待编译的方法数以及编译线程数来动态调整,

回边计数器是为了触发 OSR On StackReplacement编译 栈上编译,就是碰到一些循环代码,当循环次数达到阈值时,把这些代码编译成机器

语言并缓存,以提高执行效率,接下来我们看看JIT具体为我们做了哪些优化

方法内联:方法的调用,需要经历在虚拟机栈的压栈和出栈,本来我们程序在执行,碰到要执行方法了,我们就得去方法的内存地址那边,

把方法执行完再回去,这就要求我们得先记住我们原来怎么样的执行完方法回去还得恢复回来然后继续执行,如果一个方法执行次数很多次,

我们得来来回回好多次,产生时间和空间开销也不小,而且感觉起来不怎么必要对不对,方法内联的就是把目标方法的代码复制到

发起调用的方法里面然后执行,举个例子你们就清楚了:比如一个方法A,有四个入参 1234,目的是想完成1+2+3+4,然后A方法里面

又调用了B、C两个方法,B方法执行1+2,C方法执行3+4,蛮傻的,那么方法内联就会把A方法变成1+2+3+4,然后因为这涉及到内存的复制嘛,

如果方法体太大的话,就不会这么做了,经常执行的方法,默认情况下,方法体大小小于 325 字节的都会进行内联,我们可以通过 -

XX:MaxFreqInlineSize=N 来设置大小值;不是经常执行的方法,默认情况下,方法大小小于 35 字节才会进行内联,我们也可以通过 -

XX:MaxInlineSize=N 来设置置大小值。

所以先小总结一下就是:我们可以通过设置 JVM 参数来控制热点阈值,以便更多的方法可以执行内联,,然后我们coding的时候,尽量方法写得小一点,多几个,还有就是尽量用 final、private、static 关键字修饰方法,因为比如public的方法可以被继承,会有额外的类型检查开销

逃逸分析:Escape Analysis就是判断一个对象有没有被外部的线程执行到,没有的话,可以做如下优化

栈上分配:我们创建一个对象,是在堆里面分配内存的,当不再使用时,会经历垃圾回收机制回收掉,相对于堆分配而言,在栈里面的对象的

创建和销毁显然成本更低,简而言之,一个是全局的一个是局部的,这时经过逃逸分析发现一个对象只有在这个方法里面使用,那么就是把这个

对象分配在栈里面。

锁消除:同样的道理,假如一个对象加了锁,但是其实他就在这个方法里面使用,显然毫无竞争关系,那么JIT会把这个对象的方法锁消除掉,

举个例子:StringBuffer,你只在一个方法里面对方法里面的字符串在append,锁显然没必要。

标量替换:同样的道理,比如一个studnt对象,里面只有一个int的age,我们对这个age进行操作,JIT编译就不会去创建这个student对象,

而是直接创建一个int的age然后在栈里面操作

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

推荐阅读更多精彩内容