美文网首页
JVM随笔(一):oop-Klass模型以及类加载原理

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

作者: 醉起步溪月啊 | 来源:发表于2020-09-08 14:45 被阅读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方法。静态代码块的语句执行顺序与编写的顺序一致。


    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/ktmxeftx.html