1.JVM是什么
JVM全称Java Virtual Machine,也叫作Java虚拟机,是Java程序运行的必不可少的环境,它可以将为class字节码文件编译为机器识别码来实现跨平台运行,所以JVM是JRE的一部分。
2.OOP-Klass模型
Klass是Java类在JVM中的一种存在形式,可以说每个Java类在JVM中都有与之相对应的实例,而这个实例 就是 Klass。
Klass模型图如下
① InstanceKlass
储存java类的元信息
- InstanceMirrorKlass
学名:镜像类,用于表示java.lang.Class,java中的类即是对应着C++中的这个实例,存储在堆中(大家都知道,java对象在JVM就是存储在堆内存的)<
- InstanceRefKlass
java.lang.ref.Reference的子类,其余解释待补充
- InstanceClassLoaderKlass
解释待补充
② ArrayKlass
储存java数组的元信息
- TypeArrayKlass
是代表基本数据类型的数组(八大基本数据类型)
- ObjArrayKlass
是代表引用类型的数组
3.类的加载过程
类的加载过程一般分为七个阶段
我们接下来谈谈这七个阶段分别做了哪些工作
- 加载
1.根据全限定名(即包名+类名)找到class文件
2.解析为运行时数据,即InstanceKlass实例,存放在方法区
3.在堆内存中生成class对象,即InstanceMirrorKlass实例(镜像类)
因为没有指明必须从哪获取class文件,脑洞大开的工程师们开发了这些
1、从压缩包中读取,如jar、war
2、从网络中获取,如Web Applet
3、动态生成,如动态代理、CGLIB
4、由其他文件生成,如JSP
5、从数据库读取
6、从加密文件中读取
那么何时才会进行类的加载工作呢?
答案当然就是:主动加载时才会进行加载。
主动加载的场景有:
1.反射
2.初始化一个子类需要加载父类的时候
3.启动类(Main函数所执行的类)
4.new、getstatic、putstatic、invokestatic
当然除了主动加载场景外,还有预加载的几个特例
包装类、String、Thread
- 验证
1、文件格式验证
2、元数据验证
3、字节码验证
4、符号引用验证
- 准备
为静态变量分配内存控制、赋初值。
Java类中的实例变量,一般都是在类加载的时候才会赋值,所以没有“赋初值”这么一说。
基本数据类型的初值是按照下表规则来初始化的
如果被final关键字修饰,那这个值会被加上ConstantValue,即在准备阶段就完成赋值,就没有赋初值这一步,属于直接引用
4. 解析
间接引用 —>直接引用
- 初始化
1.执行静态代码段
2.定义一个static的属性,在JVM中会自动生成一个clinit方法(可以理解为生成静态代码段,供初始化时执行)
代码顺序跟定义的代码顺序是保持一致的
- 使用
- 卸载