JVM结构如下图所示,由编译器,加载器,执行器和运行时数据区构成。
JVM内部结构
JVM内部也有编译器。上图缺少这个。
类加载其实就是根据编译后的class文件,将java字节码载入JVM内存,并完成对运行数据处于的初始化工作,供执行引擎执行。
类加载器工作原理:双亲委派原则(parent-first delegation model)。加载器试图加载某个类,会委托给父加载器加载,如果父加载器不能加载,则该加载器才会加载。
JVM自带的加载器分为启动类加载器,扩展类加载器和应用程序类加载器,每个类加载器在JVM中只有一个实例。如果可以自定义类加载器,它的父加载器是应用程序类加载器。
一个类由它的全限定名(包名+类名)和类加载器(实例)共同唯一确定。一个类只能被同一类加载器加载一次。
什么时候进行类加载呢?
1:当使用new关键字,和读取一个类的静态属性的时候(静态变量与静态方法,但是静态final的除外)。
2:当使用反射获取一个类的时候;
3:当初始化一个子类,必须首先加载并初始化其父类;
4:当执行一个含有main方法的类的时候,必须首先加载含有那个main方法的类。
字节码(bytecode)是跨平台跨语言的基石,class文件是JVM的数据入口,是个二进制字节流,不一定存储在硬盘上。
编译期将源文件编译成class文件(由字节码构成),JVM加载并执行这个文件里的字节码。
JVM面向 操作数栈 而非寄存器,JVM指令 = 操作码 + 操作数(0个或者多个)
HotSpot虚拟机中,解释执行和编译执行并存。(混合模式)
javac字节码编译器:java文件转变为class文件
JIT:Just in Time,将热点代码从字节码编译成本地机器代码
分层编译和执行
0层:解释执行
1层:Client Compiler 编译执行
2层:Server Compiler编译执行
2019-07-16
生成一个类,除了new还有反射。这是最基本的思维。
网友评论