JVM(二)--Java代码编译和执行的过程

Java代码编译是由Java源码编译器来完成,流程图如下所示:
这里写图片描述

Java字节码的执行是由JVM执行引擎来完成,流程图如下所示:
这里写图片描述

Java代码编译和执行的整个过程包含了以下三个重要的机制:

  • Java源码编译机制
  • 类加载机制
  • 类执行机制
Java源码编译机制

由以下三个过程构成:

  • 分析(词法、语法分析)和填充符号表
  • 注解处理
  • 语义分析和字节码生成(.class文件)

词法分析
将源代码转变为标记(Token)集合,标记是编译过程的最小元素。如 int a = b + 2; —> int、a、=、b、+、2
语法分析
根据语法将Token序列生成抽象语法树(抽象语法树:描述程序代码语法结构的树形表示方式)
填充符号表
符号表是由一组符号地址和符号信息组成的表格(类似哈希表的K-V值对形式)、符号表所登记的信息在编译的不同阶段都要用到。如在语义分析中,符号表用于语义检查(如检查一个名字的使用和原先的说明是否一致)和产生中间代码。在目标代码生成阶段,当对符号名地址分配时,符号表是其依据。

注解处理
处理用户自定义的annotation,可以生成附加代码,节省共用代码的编写

语义分析
1、标注检查:包括变量使用前是否声明,变量与赋值之间的数据类型是否匹配,常量折叠(int a = 1 + 2; —> int a = 3;)等等
2、数据及控制流分析:包括方法每条路径是否有返回值异常是否处理等
3、解语法糖:语法糖是指在语言中添加某种语法,对语言功能没有影响,但方便程序员使用,Java中最常见的语法糖有泛型,Java虚拟机运行时不支持,故需要还原原来的语法

字节码生成:此阶段除了字节码的生成外,还包括实例构造器()方法和类构造器()方法添加到语法树,把字符串的加操作替换成StringBuffer或StringBuilder的append()操作

最后生成的class文件由以下部分组成:

  • 结构信息。包括class文件格式版本号及各部分的数量与大小的信息
  • 元数据。对应于Java源码中声明与常量的信息。包含类/继承的超类/实现的接口的声明信息、域与方法声明信息和常量池
  • 方法信息。对应Java源码中语句和表达式对应的信息。包含字节码、异常处理器表、求值栈与局部变量区大小、求值栈的类型记录、调试符号信息

类加载机制
JVM的类加载是通过ClassLoader及其子类来完成的,类的层次关系和加载顺序可以由下图来描述:
这里写图片描述

1)Bootstrap ClassLoader

负责加载$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++实现,不是ClassLoader子类

2)Extension ClassLoader

负责加载java平台中扩展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目录下的jar包

3)App ClassLoader

负责记载classpath中指定的jar包及目录中class

4)Custom ClassLoader

属于应用程序根据自身需要自定义的ClassLoader

类执行机制
JVM是基于栈的体系结构来执行class字节码的。线程创建后,都会产生程序计数器(PC)和栈(Stack),程序计数器存放下一条要执行的指令在方法内的偏移量,栈中存放一个个栈帧,每个栈帧对应着每个方法的每次调用,而栈帧又是有局部变量区和操作数栈两部分组成,局部变量区用于存放方法中的局部变量和参数,操作数栈中用于存放方法执行过程中产生的中间结果。栈的结构如下图所示:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值