OOP-Klass模型
java中每个类在JVM中都有一个Klass类的实例与之相对应,存储类的元数据信息:常量池、属性信息、方法信息等等......
Klass模型的继承结构如下
klass模型继承结构从类的继承结构可以看出类的元数据信息是存储在元空间的。
普通的Java在JVM中对应的是InstanceKlass实例,再看下对应的3个子类
1、InstanceMirrorKlass:用于表示java.lang.Class的对象,java中获取到的Class对象就是这个
该对象存储在堆中,又称为镜像类。
2、InstanceRefKlass:用于表示java/lang/ref/Reference类的子类,表示强软弱虚4中类型。
3、InstanceClassLoaderKlass:用于遍历某个加载器加载的类。
Java中的数组不是静态类型,而是动态类型,是运行时动态生成的,用ArrayKlass的子类表示
1、TypeArrayKlass表示基本类型的数组 如 int[] boolean[] double[]等等。
2、ObjArrayKlass表是的java中引用类型的数组结构 如 User[]等等。
类加载的过程
类的生命周期由7个步骤,其中类加载过程有5个步骤,如图:
类的生命周期加载阶段
1、通过类的全限定名获取存储该类的class文件(未指定具体文件的来源)。
2、解析运行时数据,生成InstanceKlass实例存放在方法区。
3、在堆中生成该类的Class对象,也就是之前提到InstanceMirrorKlass实例。
何时加载?
java使用的惰性加载,除了一些常用的类如String、Thread、包装类等会先进行预加载,其它类的则会在主动使用的时候进行加载。
加载时机如下,满足一下任意一条就会触发加载:
1、new getStatic putStatic invokeStatic
2、反射
3、 初始化一个类,会先加载其父类
4、启动类(main方法所在的类)
5、当使用jdk1.7动态语言支持时,如果一个java.lang.invoke.MethodHandle实例最后的解析结果REF_getstatic,REF_putstatic,REF_invokeStatic的方法句柄,并且这个方法句柄所对应的类没有进行初始化,则需要先出触发其初始化
验证阶段
1、文件格式验证
2、元数据验证
3、字节码验证
4、符号引用验证
准备阶段
为静态变量分配内存并且赋初始值
final修饰的静态变量没有赋初始值一说,在编译时直接将变量放入constantValue属性中,然后再准备阶段直接进行赋值。
解析阶段
解析阶段简单点说就是将符号引用转成直接引用的过程
初始化阶段
初始化过程就是执行静态代码块完成静态变量的赋值,即使没有在代码中显示编写static代码块,只要有静态变量,JVM会自动生成clinit方法。静态代码块的语句执行顺序与编写的顺序一致。
网友评论