前言

我们都知道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)->热点代码走它,会将编译后的指令码保存下来,下次直接执行。

四、执行

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


版权声明:本文为qq_35785465原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_35785465/article/details/124569306