前言
我们都知道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 版权协议,转载请附上原文出处链接和本声明。