类加载器


概念

Java类加载器是JRE的一部分,负责动态加载Java类到JVM的内存空间中

Java默认有三种类加载器:

  1. BootstrapClassLoader,BootstrapClassLoader(引导启动类加载器):嵌在JVM内核中的加载器,该加载器是用C++语言写的,主要负载加载JAVA_HOME/lib下的类库,引导启动类加载器无法被应用程序直接使用
  2. ExtensionClassLoader,ExtensionClassLoader(扩展类加载器):ExtensionClassLoader是用JAVA编写,且它的父类加载器是Bootstrap。 是由sun.misc.Launcher$ExtClassLoader实现的,主要加载JAVA_HOME/lib/ext目录中的类库。它的父加载器是BootstrapClassLoader
  3. App ClassLoader,App ClassLoader(应用类加载器):App ClassLoader是应用程序类加载器,负责加载应用程序classpath目录下的所有jar和class文件。它的父加载器为Ext ClassLoader

类在内存中只会被加载一次,这是因为类加载器使用了双亲委派模型

双亲委派模型:当一个类加载器遇到类的加载请求,它不会自己加载这个类,而是把请求发送给父类加载器,如果这个类是父类已经加载过的,可以直接进行使用,只有当父类反馈自己无法完成加载请求的时候,类加载器才会进行加载,保证类不会被重复加载

除了保证类只被加载一次以外,双亲委派模型还可以保护Java核心类库不被污染,即使有程序员自己编写了一个String类,在加载时,类加载器也会先请求父类加载,这样会找到BootStrap Class Loader已经加载好的jar包的String类,而不是人为污染的String类

Object o = new Object();
Demo1 demo1 = new Demo1();
system.out.println(o.getClass().getClassLoader());
system.out.println(demo1.getClass().getClassLoader().getParent().getParent());

以上代码输出的结果皆为null,因为java触碰不到c语言编写的BootstrapClassLoader


java代码加载到内存的过程

在这里插入图片描述


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值