java源码编译机制
class文件通常由类加载器(ClassLoader)来完成加载;class的执行在Sun JDK中有解释执行和编译为机器码执行两种方式,其中编译为机器码又分为两种方式(client和server两种模式)。Sun JDK为了提升class的执行效率,对于解释执行和编译为机器码执行都设置了很多优化策略
javac编译源码为class文件的步骤
1、分析和输入到符号表
2、注解处理
3、语义分析和生成class文件
生成class文件的步骤
首先将实例成员和初始化器收集到构造器中,将静态成员初始化器收集为<clinit>();接着将语法抽象树生成字节码,采用的方法为后续遍历语法树,并进行最后的少量代码转换,(如String相加变成StringBuffer操作),最后从符号表生成class文件。
一个class文件包含以下信息,(结构信息、元数据、方法信息)
类加载机制
JVM将类加载分为3个步骤:装载、链接、和初始化
不同的类分别采用不同的ClassLoader或者ClassLoader的子类进行加载
类执行机制
字节码解释执行机制
JVM采用了invokestatic,invokevirtual,invokeinterface和invokespecial四个指令来执行不同的方法调用。invokestatic对应调用static方法,invokevirtual对应调用对象的实例方法,invokeinterface对应调用接口方法,invokespecial对应调用private方法和编译后生成的<init>方法,此方法为对象实例化时初始化方法
基于栈的体系结构执行字节码,好处为代码紧凑,体积小。执行过程中产生程序计数器PC和栈,PC存放下一指令的在方法内的偏移量,栈中存放栈帧,栈帧分为局部变量区和操作数变量区(执行解释执行、栈顶缓存、部分栈帧共享)
编译执行
C1 方法内联、去虚拟化、冗余消除
C2 标量替换、栈上分配、同步消除