美文网首页
JVM加载类的完全过程

JVM加载类的完全过程

作者: Franck_ | 来源:发表于2020-09-23 09:27 被阅读0次

    1.什么时候加载类?

    2.加载类有哪些过程?

    3.类加载的详细过程。

    4.双亲委派机制。

    我们清楚的一个前提是,编写的源文件.java最后要编译成.class才能被运行。总的来说,一个类,最后会被编译成一个class文件。JVM加载和执行的是class文件。

    1.什么时候加载类?

    我们的类是存放在硬盘上的,什么时候JVM会将编写好的类加载进去JVM内存去执行呢?一般来说,是在代码用使用这个类的时候,JVM才会将.class文件加载进去JVM内存中。

    例如有一个Test类,使用jar命令编译后,再使用jar命令执行这个Test.class文件的时候。JVM启动的时候就会加载这个Test类,并且从main方法开始执行。

    image.png

    这个类稍微改一下,如下图:


    image.png

    main方法还会使用到Demo这个类,那么在执行new Demo()之前,就会加载Demo这个类进JVM的内存。

    类加载到使用到使用完毕会经过7个过程:
    加载 -》验证 -》 准备-》解析-》初始化-》使用-》卸载

    1. 加载
      类加载器,将二进制字节码文件加载入JVM的过程。由于JVM没有限定用什么方式加载,可以加载生成好的本地文件,可以从网络加载,甚至可以动态生成一个字节码文件。

    2. 验证
      加载字节码文件后,需要进行验证,防止加载的文件是非法文件,或者是损害JVM的文件。

    3. 准备
      准备阶段中,会为类和类变量(static修饰的变量)分配内存空间,赋予初始值(0值)。 如果类变量是常量的话,则直接赋常量值。

    4. 解析
      将字符引用解析为直接引用的过程。非常复杂。

    5. 初始化
      这个阶段,会执行类的静态代码块和对类变量(static修饰的变量)进行赋值,赋予代码设定的值,如果值是调用一个方法产生,则会执行这个方法。

    6. 使用
      进行实例化,方法调用,等等。

    7. 卸载
      就类从永久代/元数据空间清除,这个要求比较苛刻。



    以上是关于整个类加载的过程的简易总结,详细过程如下:

    1. 加载
    1. 双亲委派机制。
      加载类有多个,并且有层级关系。 最顶层的是Bootstrap ClassLoader(启动加载器),负责加载Java的最基础的类库。 然后是Extension ClassLoader(扩展加载器),负责加载lib/ext下的类库。然后是Application ClassLoader(应用程序加载器) ,负责加载编写好的classPath路径下的类库。

    还有自定义的类加载器。 自定义的加载器,在应用程序加载器的下一层。

    双亲委派机制的意思是,加载器首先让父类去加载,如果父类加载不了,才用子类去加载。

    那么,加载的顺序是,应用程序加载器,请求扩展加载器去加载,扩展加载器请求启动加载器去加载,启动加载器加载不了,则加载这个会回到扩展类加载器,扩展加载器也加载不了,才让应用程序加载器去加载。

    同一个类,被同一个加载器加载,才算是同一个类。 双亲委派机制,可以保证,同一个类,被同一个加载器加载。

    相关文章

      网友评论

          本文标题:JVM加载类的完全过程

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