详解JVM--类加载、类加载器和双亲委派机制

1、类加载

定义:Java虚拟机把描述类的数据加载到内存里面,并且对数据进行校验、解析和初始化,最终变成可以被虚拟机直接使用的class对象。
过程:1、通过全类名获得该类的二进制流。
2、将该二进制流的静态存储结构转为方法区的运行时的数据结构。
3、在堆中为该类生成一个class对象。

2、类加载器

定义:类加载器是指通过一个类的全类名获取该类的二进制字节流叫做类加载器。
类加载器可以分为以下4种:
1、启动类加载器(BootStrapClassLoader):用来加载Java核心类库,无法被Java程序直接引用。
2、扩展加载器(ExtensionClassLoader):用来加载Java的扩展库,Java的虚拟机实现会提供一个扩展库目录,该类加载器在扩展库目录里面查找并加载Java类。
3、系统类加载器(AppClassLoader):它根据Java的类路径来加载类,一般来说,Java应用的类都是通过它来加载的。
4、自定义加载器:由Java语言实现,继承自ClassLoader
在这里插入图片描述

3、双亲委派机制

Java源程序经过编译器编译成.class文件,也就是字节码文件,然后类加载器将这些字节码文件加载到JVM中执行。当一个类加载器收到一个类加载请求的时候,就会使用双亲委派机制,首先系统会判断当前类是否被加载过,已经被加载过的类会直接返回,否则才尝试加载。加载的时候。首先会把该请求委派给该父类加载器的loaderClass()处理,因此所有的请求最终都应该传送到启动累加载器BootstrapClassLoader中。当父类加载器无法处理的时候,才由自己处理。
在这里插入图片描述

其实这个双亲的翻译很容易让人误解,我们一般理解的双亲是指父母,这里的双亲更多的是表达“父母这一辈的”人而已,并不是说有一个Mather ClassLoader和Father ClassLoader.另外。类加载器之间的“父子关系”也不是通过继承来实现的,而是通过“优先级”来实现的。

如果不想使用双亲委派机制,我们只需要自定义类加载器,继承ClassLoader类。重写loadClass方法和findClass方法即可。比如Tomcat应用的类加载器会优先自行加载对应目录下的class,并不会委派给父类加载器,加载不了才会委派给父类加载器。

好处:保证了Java程序的稳定运行,可以避免类的重复加载,也保证了Java的核心API不被篡改。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值