专栏首页海说晚期(运行期)优化

晚期(运行期)优化

  即时编译器(Just In Time Compiler)为了提高执行效率将热点代码编译成与本地平台相关的机器码,并进行各种层次的优化的编译器。它并不是虚拟机必需的部分,但其性能的好坏、代码优化程度的高低却是衡量一款商用虚拟机优秀与否的最关键指标之一,也是虚拟机中最核心且最能体现虚拟机技术水平的部分。

HotSpot虚拟机内的即时编译器

HotSpot虚拟机内同时包含解释器与编译器,两者各有优势。优势体现如下:

1、当程序需要迅速启动和执行的时候,解释器可以首先发挥作用,省去编译的时间,立即执行;在程序运行后,随着时间的推移,编译器逐渐发挥作用,把越来越多的代码编译成本地代码之后,可以获取更高的执行效率。

2、当程序运行环境中内存资源限制较大,可以使用解释执行节约内存,反之可以使用编译执行来提升效率。

3、解释器还可以作为编译器激进优化时的一个“逃生门”,让编译器根据概率选择一些大多数时候都能提升运行速度的优化手段。

编译优化技术

编译优化技术的代码优化变换是建立在代码的某种中间表示或机器码之上,绝不是建立在java源码之上的。最有代表性的优化技术如下:

1、公共子表达式消除:如果一个表达式E已经计算过了,并且从先前的计算到现在E中所有变量的值都没有发生变化,那么E的这次出现就成为了公共子表达式。

2、数组边界检查消除:java语言是一门动态安全的语言,每次对数组的读写访问时都会执行数组是否越界检查。

3、方法内联:可以消除方法调用的成本,为其他优化手段建立良好的基础

4、逃逸分析:目前java虚拟机中比较前沿的优化技术,不是直接优化代码,只为其他优化手段提供依据的分析技术。其基本行为就是分析对象动态作用域:当一个对象在方法中被定义后,它可能被外部方法所引用,例如作为调用参数传递到其他方法中,称为逃逸。甚至还有可能被外部线程访问到,譬如赋值给类变量或可以在其他线程中访问的实例变量,称为线程逃逸。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 早期(编译期)优化

      相当多新生的java语法特性,都是靠编译器的“语法糖”来实现,而不是依赖虚拟机的底层改进来支持,java中即时编译器地运行期的优化过程对于程序运行来说更重要...

    YGingko
  • vue前端页面跳转参数传递及存储

    不同页面间进行参数传递,实现方式有很多种,最简单最直接的方式就是在页面跳转时通过路由传递参数,如下所示。 路由传递参数 this.$router.push({ ...

    YGingko
  • 11、借助POI实现Java生成并打印excel报表(2)

    POI 打印功能 11.1、常用模块形式: 1 HSSFPrintSetup printSetup = sheet.getPrintSetup(...

    YGingko
  • KVM综合实验

    1)首先我们创建好存储池/mykvm/kvm-vm,和镜像存储池/mykvm/iso

    L宝宝聊IT
  • 【JS】327- javascript 的 api 设计原则

    本篇博文来自一次公司内部的前端分享,从多个方面讨论了在设计接口时遵循的原则,总共包含了七个大块。系卤煮自己总结的一些经验和教训。本篇博文同时也参考了其他一些文章...

    pingan8787
  • StringBuilder为什么线程不安全?

    我:StringBuilder不是线程安全的,StringBuffer是线程安全的

    Java团长
  • 为什么 StringBuilder 不是线程安全的?

    我:StringBuilder不是线程安全的,StringBuffer是线程安全的

    Java技术栈
  • StringBuilder为什么线程不安全?

    我:StringBuilder不是线程安全的,StringBuffer是线程安全的

    JAVA葵花宝典
  • 面试官:StringBuilder 究竟为什么线程不安全?我哑巴了

    我:StringBuilder不是线程安全的,StringBuffer是线程安全的

    程序员小强
  • 为什么 StringBuilder 不是线程安全的?

    我:StringBuilder不是线程安全的,StringBuffer是线程安全的

    一个优秀的废人

扫码关注云+社区

领取腾讯云代金券