java程序代码需要编译后才能在虚拟机中运行,编译涉及到非常多的知识层面:编译原理、语言规范、虚拟机规范、本地机器码优化等;了解编译过程有利于了解整个Java运行机制,不仅可以使得我们编写出更优秀的代码,而且还可以使得在JVM调优时更得心应手。

下面我们先来看下Java体系中的三种编译方式:前端编译、即时编译(JIT编译)、静态提前编译(AOT编译),先来了解它们各有什么优点和缺点,再来看看主流的前端编译 JIT编译方式的运作过程。

1、前端编译

把Java源码文件(.java)编译成Class文件(.class)的过程;

也即把满足Java语言规范的程序转化为满足JVM规范所要求格式的能;

优点:

a.这阶段的优化是指程序编码方面的;

b.许多Java语法新特性('语法糖':泛型、内部类等等),是靠前端编译器实现的,而不是依赖虚拟机;

c.编译成的Class文件可以直接给JVM解释器解释执行,省去编译时间,加快启动速度;

缺点:

1.对代码运行效率几乎没有任何优化措施;

2.解释执行效率较低,所以需要结合下面的JIT编译;

3.前端编译器:Oracle javac、Eclipse JDT中的增量式编译器(ECJ)等;

2、后端编译/即时(JIT)编译

通过Java虚拟机(JVM)内置的即时编译器(Just In Time Compiler,JIT编译器);在运行时把Class文件字节码编译成本地机器码的过程;

优点:

a.通过在运行时收集监控信息,把'热点代码'(Hot Spot Code)编译成与本地平台相关的机器码,并进行各种层次的优化;

b.可以大大提高执行效率;

缺点:

a.收集监控信息影响程序运行;

b.编译过程占用程序运行时间(如使得启动速度变慢);

c.编译机器码占用内存;

d.JIT编译器:HotSpot虚拟机的C1、C2编译器等;

另外,JIT编译速度及编译结果的优劣,是衡量一个JVM性能的很重要指标;所以对程序运行性能优化集中到这个阶段;也就是说可以对这个阶段进行JVM调优;

3、静态提前编译(Ahead Of Time,AOT编译)

程序运行前,直接把Java源码文件(.java)编译成本地机器码的过程;

优点:

a.编译不占用运行时间,可以做一些较耗时的优化,并可加快程序启动;

b.把编译的本地机器码保存磁盘,不占用内存,并可多次使用;

缺点:

a.因为Java语言的动态性(如反射)带来了额外的复杂性,影响了静态编译代码的质量;

b.一般静态编译不如JIT编译的质量,这种方式用得比较少;

c.静态提前编译器(AOT编译器):JAOTC、GCJ、Excelsior JET、ART (Android Runtime)等;

4、前端编译 JIT编译

到这里,我们知道目前Java体系中主要还是采用前端编译 JIT编译的方式,如JDK中的HotSpot虚拟机。

前端编译 JIT编译方式的运作过程大体如下:

1、首先通过前端编译把符合Java语言规范的程序代码转化为满足JVM规范所要求Class格式;

2、然后程序启动时Class格式文件发挥作用,解释执行,省去编译时间,加快启动速度;

3、针对Class解释执行效率低的问题,在运行中收集性能监控信息,得知'热点代码';

4、JIT逐渐发挥作用,把越来越多的热点代码'编译优化成本地代码,提高执行效率;

视频资源下载

java aot,Java三种编译方式: 前端编译 JIT编译 AOT编译相关推荐

  1. Java多线程的三种实现方式(重点看Collable接口实现方式)

    1.通过继承Thread类来实现多线程 在继承Thread类之后,一定要重写类的run方法,在run方法中的就是线程执行体,在run方法中,直接使用this可以获取当前线程,直接调用getName() ...

  2. java支持哪三种注释方式,震撼来袭免费下载!

    One:JVM实践思维图(完整版) Two: 走近Java 概述+ Java技术体系+Java发展史+Java虚拟机家族:(Sun Classic/Exact VM.HotSpot VM.Mobile ...

  3. java 代理的三种实现方式

    Java 代理模式有如下几种实现方式: 1.静态代理. 2.JDK动态代理. 3.CGLIB动态代理. 示例,有一个打招呼的接口.分别有两个实现,说hello,和握手.代码如下. 接口: public ...

  4. java下标越界的三种处理方式,数组下标越界,该怎么解决

    数组下标越界 package import_csv; import java.io.BufferedReader; import java.io.FileInputStream; import jav ...

  5. java如何实现定时任务_Java定时任务的三种实现方式

    前言 现代的应用程序早已不是以前的那些由简单的增删改查拼凑而成的程序了,高复杂性早已是标配,而任务的定时调度与执行也是对程序的基本要求了. 很多业务需求的实现都离不开定时任务,例如,每月一号,移动将清 ...

  6. CSS的三种引入方式与JS的三种引入方式

    CSS的三种引入方式 前端三剑客分为html,css,js, html作为骨架,楼体是观看者看到的第一元素,而css和js是美化并增加功能的肉体羽毛或者楼体工装,肉体羽毛需要安装到骨架上,才能使整体完 ...

  7. java servlet接口开发_servlet三种实现方式之一实现servlet接口

    servlet有三种实现方式: 1.实现servlet接口 2.继承GenericServlet 3.通过继承HttpServlet开发servlet 第一种示例代码如下(已去掉包名): import ...

  8. java中map的遍历方法_Java中Map的三种遍历方式

    集合中的三种遍历方式,如下代码: import java.util.Collection; import java.util.HashMap; import java.util.Iterator; i ...

  9. java源代码实例倒计时_Java倒计时三种实现方式代码实例

    写完js倒计时,突然想用java实现倒计时,写了三种实现方式 一:设置时长的倒计时: 二:设置时间戳的倒计时: 三:使用java.util.Timer类实现的时间戳倒计时 代码如下: package ...

  10. java定义数组_java中数组的三种定义方式_java中数组的定义及使用方法(推荐)...

    java中数组的三种定义方式 java中,数组是一种很常用的工具,今天我们来说说数组怎么定义 [java] view plain copy /** * 数组的三种定义方法 * 1.数组类型[] 数组名 ...

最新文章

  1. Nginx —— nginx负载均衡的详细配置 以及 使用案例详解.
  2. 面试题64. 求1+2+…+n
  3. LeetCode每日一题 24. 两两交换链表中的节点
  4. 如何找到某个 ABAP structure 某字段的源头来自哪个数据库表
  5. 白话解说TCP/IP协议三次握手和四次挥手
  6. 基于深度学习的眼底影像分析最新综述
  7. 机器学习经典算法具体解释及Python实现--K近邻(KNN)算法
  8. 极品五笔输入法2009_考场指南!2020年注会机考计算器使用指南及输入法切换
  9. 基于STM32的电量采集系统
  10. pdf合并成一个文件,pdf合并方法
  11. studio3t连接mysql_使用 Studio 3T 连接到 Azure Cosmos DB 的 API for MongoDB | Microsoft Docs
  12. phpstudy安装配置教程
  13. UIpath2021.10下载、安装、激活
  14. 刷脸支付就是会员为大商户管理与运营提供帮助
  15. 吉林大学2021计算机专业考研方向,注意!2021计算机考研这些院校专业有变更
  16. 自动分发秘钥脚本(复制修改ip即可使用)
  17. 在线画图软件draw.io
  18. Spring MVC 防止XSS注入
  19. oracle 8103错误,【数据恢复】详解ORA-8103错误
  20. c语言教学系统设计报告,C语言课程设计报告-范例Word版

热门文章

  1. 怎样改变图片尺寸大小不变形?如何设置图片尺寸?
  2. 中考计算机考试试题2018,2018年中招考试电脑阅卷流程曝光,你一定要知道
  3. 首战 之 Flutter 1.0 久违了(Mac)
  4. Android Settings中System/Global/Secure
  5. RMVB转换成家用DVD可播放的格式
  6. JAVA GUI文字游戏
  7. Java--捕鱼达人
  8. Facebook败给Foursquare
  9. 黑客教父郭盛华:警惕电脑被植入硬件键盘记录器
  10. ansible 命令只执行一次