码迷,mamicode.com
首页 > 其他好文 > 详细

JVM - 1 - 源文件编译过程

时间:2018-07-18 17:19:46      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:语法   执行引擎   区域   12px   知识点   内存区域   垃圾回收算法   java   源代码   

前言

  简单的针对JAVA虚拟机(JVM)相关知识做一个总结,从此章开始这是一个系列文章,包括内容有;

    1 前端编译,AOT(静态编译),JIT即时编译

    2 字节码文件的结构,类加载机制以及运行时内存区域

    3 关于对象的创建,内存的分配,访问的定位,判断对象是否可用,内存的回收

    4 对象内存分配及垃圾回收策略以及垃圾回收算法

    5 JVM执行引擎

    6 JVM提供的性能监控与故障处理工作,常用的JVM参数配置

  

本章内容

  注意:编译过程分为两个部分,运行前编译,以及运行时编译,运行前编译是在JVM工作开始前的操作,本章即介绍此部分

  说明:编译过程包括(语法,词法,语义的具体分析),这里只是简单的介绍编译器的工作流程,没有深入的去分析

 

知识点

  1 前端编译

  2 AOT(静态代码)编译

 

前端编译 (将源代码编译成字节码 例如:javac)

  1 编译过程

    1.1 解析与填充符号表(词法分析和语法分析)

      词法分析将源代码转换成Token(标记),语法分析再根据token构造出抽象语法树,然后根据词法分析之后的结果填充符号表

    1.2 插入式注解处理

      可以实现在编译期间对注解进行处理,通过实现插入式注解器可以访问和修改抽象语法树中的任意元素.如果一个插入式注解处理器修改了抽象语法树,则在修改语法树之后回到解析与填充符号表的过程重新处理

    1.3 分析与生产字节码 (对生成的抽象语法树进行语义分析,然后生成字节码)

      1.3.1 标注检查

           变量使用前是否声明,变量类型是否匹配等.常量折叠

      1.3.2 数据与控制流分析

           检查程序的上下文逻辑是否正确 包括:方法是否每条执行路径都有返回值,异常是否被抛出或者被catch等

      1.3.3 解语法糖

           泛型,自动装箱拆箱,变长参数,for-each循环,断言语句等,这些语法糖在编译期都会被还原成简单的基础语法

  2 优点

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

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

  3 缺点

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

    3.2 解释执行效率较低 

  

AOT(静态代码)编译 (程序运行期,直接把源文件编译成本地机器码 例如:JAOTC,GCJ,ART等)

  1 优点

    1.1 程序运行前,直接把java源文件(.java)编译成本地机器码的过程 (JAOTC,GCJ,ART等)

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

  2 缺点

    因为java语言的动态性带来了额外的复杂性,影响了静态编译代码的指令

 

JVM - 1 - 源文件编译过程

标签:语法   执行引擎   区域   12px   知识点   内存区域   垃圾回收算法   java   源代码   

原文地址:https://www.cnblogs.com/hpzhu/p/9321822.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!