一、前言
学习类的加载能帮助我们了解我们写的java类如何加载到JVM内存中以及整个生命周期,使我们知其所以然,明明白白写代码。
二、Klass模型
在学习类加载之前先介绍一下Klass模型,Java的每个类,在JVM中,都有一个对应的Klass类实例与之对应,存储类的元信息如:常量池、属性信息、方法信息。JVM底层是用C++实现的,简单总结Klass是java类在C++中的表现形式。
1. MetaspaceObj
所有klass类的顶层父类
2. MetaData
MetaspaceObj有个子类是MetaData
3. klass
MetaData有个子类叫klass
4. InstanceKlass
klass的子类,存储普通java类的元信息。对应普通的java类,jvm内部使用的类, 存储在方法区也就是元空间,该类保存类的元信息,有三个子类为InstanceMirrirKlass、InstanceRefKlass、InstanceClassLoaderKlass
小贴纸:
方法区是jvm的规范,元空间是HotSpot的具体实现
- InstanceMirrirKlass: jvm暴露给程序使用的类, 存储在堆区,用来表示java.lang.Class,也就是说我们java代码中使用反射机制获取到的Class对象就是这个实例,它是存储在堆区的,而上面说的InstanceKlass是jvm内部使用的,它是存储在方法区也就是元空间。java类中的静态变量会存储在instanceMirrorKlass类中,instanceMirrorKlass类里面比instanceKlass类多定义了一个静态字段偏移量的属性,可以通过该属性获取静态变量。
- InstanceRefKlass: 用于表示java.lang.ref.Reference的子类,也就是强软弱虚引用。
- InstanceClassLoaderKlass: 用于遍历某个加载器加载的类,描述类加载器的实例。
5. Arrayklass
klass的子类,存储数组类的元信息, 存储在方法区也就是元空间。有两个子类TypeArrayKlass、ObjArrayKlass。
- TypeArrayKlass: 描述java基本数据类型的数组,存储在堆中
- ObjArrayKlass: 描述java引用类型的数组,存储在堆中
原文地址:JVM(一):Klass模型
文章评论