随笔 - 7  文章 - 0  评论 - 0  阅读 - 577

jvm之类加载器

类加载过程:一个类被加载到虚拟机的整个生命过程将会经历,加载、验证、准备、解析、初始化、使用、卸载。这七个阶段,其中验证、准备、解析这三个阶段统称为linking。

 

 

类加载时机:

      1.使用new 关键字实例化对象时。

      2.遇java.lang.reflect包的方法对类型进行反射调用时,如果类型没有进行初始化,则需先触发其父类的初始化。

      3.初始化类时,如果父类还没初始化,先初始化父类。

      4.当虚拟机启动时,用户需要指定一个要执行的主类,虚拟机会先初始化这个主类。

      5.当使用JDK7新加入的动态语言支持时,如果一个 java.lang.invoke.MethodHandle 实例最后的解析结果为 REF_getStatic、 REF_putStatic、REF_invokeStatic、REF_newInvokeSpecial 四种类型的方法句 柄,并且这个方法句柄对应的类没有进行过初始化,则需要先触发其初始化。

      6.当一个接口中定义了JDK8新加入的默认方法(被default关键字修饰的接口方 法)时,如果有这个接口的实现类发生了初始化,那该接口要在其之前被初始化。

类加载器:通过一个类的全限定名来换取描述该类的二进制流,这个动作放到Java虚拟机外部去实现,以便让应用程序自己去决定如何去获取所需的类。

类加载器类型:

    根类加载器(bootstrap class loader):用来加载Java的核心类,由C++实现,不继承ClassLoader,负责加载jre/lib/rt.jar里的所有class文件

    扩展类加载器(extensions class loader):它负责加载jre的扩展目录jre/ext,由Java语言实现。

    应用程序类加载器(application class loader):加载classpath中的类库,由Java语言实现。

    自定义类加载器:通过继承ClassLoader实现,一般是加载我们的自定义类,由Java语言实现。

 

 

双亲委派机制:

       工作过程:当一个类加载器收到了类加载的请求时,它不会尝试自己去加载这个类。而是把这个请求委派给父类加载器,每层加载器都是如此,因此所有请求都传到最顶层启动类加载器,只有父类加载器无法完成这个请求时,子加载器才会尝试自己去完成。

         优势:为了保证Java程序的稳定运行,采用双亲委派模式的是好处是Java类随着它的类加载器一起具备了一种带有优先级的层次关系,通过这种层级关可以避免类的重复加载,当父亲已经加载了该类时,就没有必要子ClassLoader再加载一次。其次是考虑到安全因素,java核心api中定义类型不会被随意替换,假设通过网络传递一个名为java.lang.Integer的类,通过双亲委托模式传递到启动类加载器,而启动类加载器在核心Java API发现这个名字的类,发现该类已被加载,并不会重新加载网络传递的过来的java.lang.Integer,而直接返回已加载过的Integer.class,这样便可以防止核心API库被随意篡改。

 

       打破双亲委派机制场景:

          1.第一种被破坏的情况是在双亲委派出现之前,由于双亲委派模型是在JDK1.2之后才被引入的,而在这之前已经有用户自定义类加载器在用了。
          2.是JNDI、JDBC等需要加载SPI接口实现类的情况。
          3.是为了实现热插拔热部署工具。为了让代码动态生效而无需重启,实现方式时把模块连同类加载器一起换掉就实现了代码的热替换。
          4.tomcat等web容器的出现。
          5.OSGI、Jigsaw等模块化技术的应用。

    参考资料:周志明.著 《深入理解Java虚拟机》

posted on   知一之一  阅读(40)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示