深入理解JVM7-JVM优化技术

JVM优化

一、JVM早期(编译期)优化

javac编译器

编译过程分为三个过程:解析(词法分析与语法分析)与填充符号表过程;插入式注解处理器的注解处理过程;语义分析与字节码生成过程。

  1. 解析与填充符号表过程
    词法分析将源代码的字符流转变为标记集合;语法分析将标记序列构造成抽象语法树。
    完成词法分析和语法分析后,下一步是填充符号表。符号表是由一组符号地址和符号信息构成的表格(类似于哈希表),用于后续编译的不同阶段使用。
  2. 注解处理器
    编译期间,插入式注解处理器可以读取、修改、添加抽象语法树中的任意元素。若对语法树进行修改,编译期将回到解析及填充符号表的过程重新处理,直到不再修改为止。
  3. 语义分析及字节码生成
    语义分析对结构正确的语法树进行上下文的审查。分为标注检查以及数据及控制流分析两个步骤。
    解语法糖指在编译阶段将语法糖还原为基础语法结构(泛型、变长参数、自动装箱等)。

二、JVM晚期(运行期)优化:JIT编译器

HotSpot中内置了两个即时编译器(Client Compiler和Server Compiler),默认采用解释器与其中一个编译器直接配合的方式工作。VM默认根据自身版本与宿主机器 的硬件性能自动选择运行模式。

JIT:在运行时,将热点代码编译成与本地平台相关的机器码,并运行各种层次的优化。

 热点代码分两类:
  1. 被多次调用的方法;
  2. 被多次执行的循环体。这两种情况,编译器都是以整个方法作为编译对象。
    热点探测
    热点探测是指判断一段代码是不是热点代码,是不是需要触发即时编译。
    目前主要的热点探测判定方式有两种:
    1. 基于采样的热点探测:VM周期性地检查各个线程的栈顶,若某个方法经常出现在栈顶,则该方法就是热点方法。
      好处:实现简单、高效,可以很容易地获取调用关系
      缺点:很难精确地确认一个方法的热度,容易因为线程阻塞或别的因素扰乱热点探测。
    2. 基于计数器的热点探测:VM为每个方法建立计数器,统计方法的执行次数,若次数超过一定的阈值就是热点方法。
      好处:统计结果精确和严谨
      缺点:需要为每个方法建立并维护一个计数器,不能直接获取到方法的调用关系。
      HotSpotVM采用基于计数器的热点探测,为每个方法准备了方法调用计数器和回边计数器.
      经典的优化技术
    3. 公共子表达式消除:已经计算过的子表达式E,并且从先前的计算到现在E中所有变量的值都没有发生变化,则直接用前面计算过的表达式结果代替E。
    4. 数组边界检查消除:java中访问数组元素时自动进行上下界的范围检查。在编译期根据数据流分析来判断没有越界,则执行时就无需判断。
    5. 方法内联:将目标方法的代码复制到发起调用的方法之中,避免发生真实地方法调用而已。消除方法调用的成本,还未其他优化手段建立良好的基础。
    6. 逃逸分析:若证明一个对象不会逃逸到方法或线程之外,也就是别的方法或线程无法通过任何途径访问到这个对象,则可以为这个变量进行一些高效的优化。如栈上分配,同步消除,标量替换等。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值