Java程序运行
1.使用javac将后缀.java的源文件编译成.class字节码文件
2.JVM加载字节码(也称为类加载)
- 从表面上看,.class文件通过加载,生成某种形式的Class数据结构进入内存,也称为反射,程序可以调用这个数据结构,创建Object
- 从上图中可以看到类加载只包括加载,连接,初始化三个过程
- 解析部分是灵活的,他可以在初始化环节之后再进行,实现所谓的后期绑定,其他环节的顺序不可改变
2.1加载
加载时一个读取Class文件(这里的Class文件不仅仅指的是本地的二进制文件,泛指各种二进制流),将其转化为某种静态数据结构存储在方法区内,并在堆中生成一个便于用户调用的java.lang.Class类型的对象的过程
2.2连接
2.2.1验证
- 文件格式验证
- 元数据、字节码的验证,保证其不会产生危害虚拟机的行为
- 符号引用验证
2.2.2准备
- 为该类型中定义的静态变量赋0值
虚拟机内存规范中定义了方法区这种抽象概念,HotSpot在JDK8之前使用永久代这种具体的实现方式来实现方法区,JDK8之后取消永久代,采用元空间这种直接内存来替代。方法区是抽象概念,是JVM规范的定义,永久代和元空间是实现方式,JDK8之后,常量池和静态变量转到堆中,类的元信息还是存放在方法区内。
2.2.3 解析
- 符号引用替换为直接引用
3.运行
- 运行时解释器将字节码解释为一行行机器码来执行
- 在程序运行期间,即时编译器会针对热点代码,将该部分字节码编译成机器码,以获取更高的执行效率