JVM的类加载

什么是Java类加载

java类加载器负责将编译好的 Java class 件加载到 Java 虚拟机(JVM)中的运行时数据区中,供执行引擎调用。

类加载机制:双亲委派机制

在这里插入图片描述
启动类加载器:**java虚拟机启动后创建的第一个类加载器,由C++语言实现,所以我们在java代码中查看其信息时,看到的均为null。负责在JVM启动时加载jdk自身的一些核心class类(jar包形式)到JVM中,加载时寻找资源的路径由只读系统属性:”sun.boot.class.path“ 指定,一般为:”JAVA_HOME/jre/classes“目录(在该目录下只能放class文件,jar包形式文件不生效)。
扩展类加载器:由启动类加载器加载,并将扩展类加载器中的parent的值设置为null(表示指向启动类加载器),同时继承自URLClassLoader。负责加载位于系统属性:"java.ext.dirs"指向的目录下加载class文件(jar包或者直接class文件形式)到JVM中,比如通常ext类加载路径为:”$JAVA_HOMEx/jre/lib/ext“ 。
系统类加载器:由启动类加载器加载,并将系统类加载期中的parent的值设置为上述创建的扩展类加载器。,同时继承自URLClassLoader。负责加载应用classpath路径下的class文件(jar包或者直接class文件形式)到JVM中,当系统中没有设置classpath路径时,默认加载当前路径下的class文件。

所谓双亲委托,顾名思义,就是当前类加载器(以系统类加载器为例)在加载一个类时,委托给其双亲(注意这里的双亲指的是类加载器中parent属性指向的类加载器)先进行加载。

双亲类加载器在加载时同样委托给自己的双亲,如此反复,直到某个类加载器没有双亲为止(通常情况下指双亲为null,也即为当前的双亲为扩展类加载器,其parent为启动类加载器),然后开始在依次在各自的类路径下寻找、加载class类。

为什么要使用双亲委派机制

1.沙箱安全机制,假设我们有一个自定义类java.lang.String.class。因为类加载器会委托父类加载器优先加载,所以jdk中的string类会被优先加载,然后应用程序类加载器在加载我们的自定义String类时发现已经有一个同名的类就不会再去加载,这样便可以防止核心API库被随意篡改。
2.避免类的重复加载:当父亲已经加载了该类时,就没有必要子ClassLoader再加载一次,保证被加载类的唯一性

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值