JVM底层类加载
2020-09-07 本文已影响0人
我有清风有烈酒
Klass模型
Java中的每个类,在JVM中都有对应的Klass类实例与之对应,储存类的元信息如:常量池、属性信息、方法信息……
Class和Klass的区别:
Class:就是Java类(Java代码);
Klass:Java类在JVM中的存在形式(C++代码)。
Klass类有哪些
- InstanceKlass:我们写的Java类(非数组类)就是对应的这个类(元信息);
- InstanceMirrorKlass:镜像类,这个东西就是Class对象(存储在堆区);
- InstanceRefKlass:用于表示java.lang.ref.Reference的子类;
- InstanceClassLoaderKlass:用于遍历某个加载器加载的类。
上面说到InstanceKlass是非数组的Java类在jvm中对应的类,那数组类在JVM中对应的是什么呢?
ArrayKlass
数组类Java类,在JVM中以ArrayKlass的形式存在的,存储数组类的元数据。
Java中的数组:
是动态数据类型:运行时动态生成的。
如何证明数组是动态生成的:
通过查看字节码文件:
- newarray:创建一个指定原始类型(int,float,char……)的数组,并将其引用值压入栈顶。
- anewarray:创建一个引用类型(如类,接口,数组……)的数组,并将其引用值压入栈顶。
TypeArrayKlass:基本数据类型的数组在JVM中的表现形式;
ObjArrayKlass:引用类型的数组在JVM中的表现形式。
类的加载过程
类的加载过程需要注意的是,在准备阶段赋初始值分两种情况:
- 非final修饰,初始值为各个数据了行的初始值,如 int 为 0,double为 0l,引用类型为 null。
- final修饰的数据,在准备阶段就会直接赋值。