JVM - 1 - 源文件编译过程

前言

  简单的针对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语言的动态性带来了额外的复杂性,影响了静态编译代码的指令

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

时间: 2024-11-08 19:53:10

JVM - 1 - 源文件编译过程的相关文章

在Unix系统上,从源文件、目标文件、可执行文件的编译过程

是由“编译器驱动”(compiler driver)完成的: unix> gcc -o hello hello.c 在这里,gcc的编译器驱动程序读取源文件hello.c, [cpp] view plaincopy #include <stdio.h> int main() { printf("hello, world/n"); return 0; } 并把它翻译成一个可执行目标文件hello,这个过程是分为四个阶段完成的.如下图所示,执行这四个阶段的程序(预处理器.

第一讲 JVM编译过程

一 丶Jvm的安装: 1.下载源代码,并将其修改于龙芯的mips体系相适应: 2.编译前需要的软件包: Gawk pattern scanning and processing language m4 GNU macro processor libasound-dev alsa声音库 libcupsys2-dev 与打印相关的库 libx11-dev X11图形库 二丶编译过程: (1).设置必要的环境变量,把环境变量的设置写到了脚本文件bootstrap中,在进行编译开始的时候source这个

JVM理论:(四/2)编译过程——晚期(运行期)

一.解释器与编译器 当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为"热点代码" .为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器称为即时编译器(JIT 编译器). 即时编译器并不是虚拟机必需的部分,但是,即时编译器编译性能的好坏.代码优化程度的高低却是衡量一款商用虚拟机优秀与否的最关键指标之一,它也是虚拟机内中最核心且最能体现虚拟机技术水平的部分. 解释器与编译器两者各有优势: 当程

2.4、uboot配置和编译过程详解

2.4.1.uboot主Makefile分析1 2.4.1.1.uboot version分析 (1)uboot版本号分为3个级别: VERSION:主版本号 PATCHLEVEL:次版本号 SUBLEVEL:再次版本号 EXTRAVERSION:另外附加的版本信息 这四个用.隔开共同构成了最终的版本号. (2)Makefile中版本号最终生成了一个变量U_BOOT_VERSION,这个变量记录了Makefile中配置的版本号 (3)include/version_autogenerated.h

Linux之多源文件编译(转)

多源文件的编译方法 如果有多个源文件,基本上有两种编译方法: [假设有两个源文件为test1.c和test2.c] 1. 多个文件一起编译 用法: gcc test1.c test2.c -o test 作用:将testfun.c和test.c分别编译后链接成test可执行文件. 2. 分别编译各个源文件,之后对编译后输出的目标文件链接. 用法: gcc -c test1.c //将test1.c编译成test1.o gcc -c test2.c //将test2.c编译成test2.o gcc

C语言程序编译过程

最近在编译DM8168的ARM端程序时经常出现未定义.重定义等报错,由于源码文件多,包含关系比较多,所以自己添加时容易乱.深深的体会到,好的代码风格是如此重要,之前也在看代码重构,以后应该更加注意代码的质量.经思考总结规律如下: 1.公用的数据结构等写为一个头文件,其他源文件包含此头文件.同时为了让不同源文件里的函数都可以使用,公用的函数可以放在此头文件中声明. 2.其他源文件里声明的变量,如果想在另一个文件里用,需要extern声明,这样可以避免各种全局变量的交互混杂. 理解的比较浅,希望高人

gcc编译过程简述

在linux系统上,从源文件到目标文件的转化是由编译器完成的.以hello.c程序的编译为例,如下: [email protected]: gcc -o hello hello.c 在这里,gcc编译器读取源文件hello.c,并把它翻译成一个可执行文件 hello. 这个翻译过程可分为四个阶段逐步完成:预处理,编译,汇编,链接,如下图所示. 逐步做下简单分析: 在未编译前,hello.c 的源代码如下 #include <stdio.h> int main() { printf("

VC++ 编译过程

一 前言 以前在编译C++代码的时候对编译的错误都觉得很难理解,搞不清楚究竟是哪里错了.后来C++写多了,总结了一些经验,然后也了解了一下编译过程,但是没有系统的对编译过程进行学习,现在趁着写博客的机会,好好的把编译过程写下来,并且理顺一下这个知识点. 二 名词解释 编译单元:当一个c或cpp文件在编译时,预处理器首先递归包含头文件,形成一个含有所有 必要信息的单个源文件,这个源文件就是一个编译单元. 目标文件:目标文件包含着机器代码(可直接被计算机中央处理器执行)以及代码在运行时使用的数据,此

linux内核的配置机制及其编译过程

linux内核的配置机制及其编译过程 国嵌第一天第三节:讲解的是内核在X86平台上的配置.安装过程,制作自己的Linux系统,并双系统启动. <Linux系统移植>第四章 http://blog.csdn.net/zhengmeifu/article/details/7682373 Linux内核具有可定制的特点,具体步骤如下: 1.1.1 配置系统的基本结构 Linux内核的配置系统由三个部分组成,分别是: 1.Makefile:分布在 Linux 内核源代码根目录及各层目录中,定义 Lin