Java编译到执行的过程


前言

我们都知道java是编译为class文件,然后在jvm中运行的,我认为有4个步骤:编译->加载->解释->执行


一、编译

编译器对java源码做「语法分析」「语义分析」「注解处理」等等处理,然后生成字节码(class)文件。eg: Lombok。

二、加载

将class加载到jvm。(装载->连接->初始化)

1.装载

1.【装载时机】jvm为了节省内存,不会一次性装载全部的类,而是需要时,才装载。 2.【装载发生】class通过「类加载器」装载到jvm,为防止重复,采用双亲委派机制。 3.【装载规则】jdk本地方法由根加载器(Bootstrap loader)装载; jdk内部扩展由扩展类加载器(ExtclassLoader)装载; 程序中的类由系统类加载器(AppClassLoader)装载; 此外还有自定义类加载器。 装载的具体内容: 1.找到class的二进制文件; 2.在「堆」中创建对象;类相关信息存入「方法区」;

2.连接(验证->准备->解析)

对class进行验证,为「类变量」分配内存空间;同时赋默认值。

1.验证

class是否符合java和jvm的规范

2.准备

class的静态变量分配内存;初始化为系统默认值。

3.解析

将符号引用转为直接引用

/**
*符号引用
*/
String xx = "abc";
System.out.print("str="+xx);
/**
*直接引用
*/
System.out.print("str="+"abc");

3.初始化

为class的静态变量赋予正确的初始值。面试问到的类方法加载顺序,就是这时候发生的。

三、解释

将class转为操作系统识别指令 1.字节码解释器->一般代码都走它。 2.即使编译器(JIT)->热点代码走它,会将编译后的指令码保存下来,下次直接执行。

四、执行

操作系统执行解释器解析后的指令码。调硬件执行。

经验分享 程序员 微信小程序 职场和发展