类加载器原理,双亲委派模型

一、JVM的工作过程

在这里插入图片描述

在JVM的运行过程涉及到三个子系统:
1)类装载子系统(Class Loader SubSystem)
2)运行时数据区(Runtime Data Areas)
3)执行引擎(Execution Engine)

1.类加载子系统

类加载子系统的作用是将字节码文件加载到JVM中,在类第一次被使用时,是需要初始化类文件。
在类加载的过程中具有以下几个阶段:
1)装载:功能就是来加载类,使用到了三个类加载器,分别是Bootstrap ClassLoader(启动类加载器)、Extension ClassLoader(拓展类加载器)和Application ClassLoader(应用类加载器)
2)连接:分为以下三个阶段:
1.验证:字节码验证器将验证生成字节码是否正确,如果验证失败,将得到验证错误。
2.准备:对于所有的静态变量,进行分配内存并给定默认值 tmp分配内存,String等类型给定默认值null,基本类型初始化为0。
3.解析: 将所有的符号内存引用替换为方法区的原始引用.
3)初始化:初始化是类加载过程中的最后一步,静态变量将被赋予原始值,静态代码块将被执行 tmp=10。

运行时数据区域

1)方法区:类级别数据、静态变量的引用,是线程的共享区域
2)堆区:new出来的对象及其实例变量和数据的存储位置,线程共享。
3)栈区:程序运行过程中会使用栈区,是线程私有的。
4)本地方法栈:保存本地方法的信息,调用JNI,是线程私有的。
5)程序计数器:是线程私有的信息。

执行引擎

分配给运行时数据区域的字节码将由执行引擎来执行,执行引擎读取字节码并逐个进行执行。

二、类加载器

类加载器的作用:负责将字节码加载到内存中。
在这里插入图片描述
各加载器的职责:
1)Bootstrap ClassLoader:启动类加载器
负责加载JAVA_HOME的jre/lib/rt.jar里面所有的class。
2)Extension ClassLoader:扩展类加载器
负责加载java平台中扩展功能的一些jar包,包括JAVA_HOME中除jre/lib/*.jar或者-DJava.ext.dirs=XXX指定路径下的jar包。
3)Application ClassLoader:应用类加载器
负责加载classpath中指定的jar和目录中的class。

三、双亲委派模型

在这里插入图片描述
通过双亲委派模型加载类的过程如下:
1)当前类的加载器会先从自己已经加载的类中查询是否此类已经加载,如果已经加载,则返回已经加载的类。
2)如果当前类加载器没有找到已经加载的类,就会委托父类加载器进行加载,父类加载器才用同样的策略,查看自己已经加载的类中是否包含这个类,如果有的话直接返回,没有的话就委托给父类去加载,直到委托给启动类加载器为止,因为启动类加载器父类为空,到启动类加载器就不会在往上进行委托。
3)如果启动类加载器加载失败,就会使用扩展类尝试加载,继续失败的话则会使用应用类加载器来加载,继续失败就会抛出一个异常:ClassNotfoundException。
首先查找自身已加载的类->委托父类->尝试在加载器指定路径下加载

双亲委派模型的优点

1.安全性,避免用户自己编写的类动态替换java的一些核心类

如果不采用双亲委派模型的加载方式进行类的加载工作,那我们就可以随时使用自定义的类来动态替代Java核心API中定义的类。例如:如果黑客将“病毒代码”植入到自定义的String类当中,随后类加载器将自定义的String类加载到JVM上,那么此时就会对JVM产生意想不到“病毒攻击”。而双亲委派的这种加载方式就可以避免这种情况,因为String类已经在启动时就被引导类加载器进行了加载。
2.避免类的重复加载

因为JVM判定两个类是否是同一个类,不仅仅根据类名是否相同进行判定,还需要判断加载该类的类加载器是否是同一个类加载器,相同的class文件被不同的类加载器加载得到的结果就是两个不同的类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值