JVM随笔(一):oop-Klass模型以及类加载原理

2020-09-08  本文已影响0人  醉起步溪月啊

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方法。静态代码块的语句执行顺序与编写的顺序一致。


上一篇 下一篇

猜你喜欢

热点阅读