JVM核心之类加载机制 有更新!

什么是类加载?

类加载机制: 指的是把Class文件加载到内存,进行数据校验,转换,解析,初始化,最终形成能够被JVM直接使用的数据类型的过程,这就是JVM的类加载机制

类加载意义: 在程序运行期间动态加载类,损失部分性能,但是大大提高了灵活性,可以在运行时加载网络中或者其他地方加载二进制流文件作为程序的一部分。动态加载和链接为程序的动态扩展提供了基础。

类加载的步骤与操作

f6a1ae34306942779eaaf013baba9cc7-image.png

类加载器

类加载器 : 把类加载过程的“通过一个类的全限定名来获取此类的二进制字节流” 这个动作放到JVM外部去实现,以便让应用程序自己去决定获取所需要的类,实现这个动作的代码模块佳作“类加载器”。

同一个类被不同的加载器加载那么他们就不是相等的,类和加载它的类的加载器共同确定了类的唯一性

双亲委派模型

JVM角度中的两种类加载器:
1. 启动类加载器[BootStrap ClassLoader],C++实现(取决于虚拟机,这里是 Hotspot)
2. 其他加载器,Java语言实现,独立于虚拟机外部,并且全部继承自Java.lang.ClassLoader

开发人员角度三种类加载器:
1、启动类加载器[BootStrap ClassLoader]: 负责加载存放在<JAVA_HOME>/lib目录中的或者被-Xbootclasspath参数所指定的路径中且被虚拟机识别的类加载到内存。

2、扩展类加载器[Extension ClassLoader]: 负责加载<JAVA_HOME>/lib/ext目录中的或者被java.ext.dirs所指定的所有路径中的所有类库,这个加载器由sun.misc.Launcher$ExtClassLoader实现。

3、应用程序加载器[Application ClassLoader]: 负责加载用户路径(ClasssPath)上所指定的类库,这个加载器由sun.misc.Launcher$AppClassLoader实现。由于这个类加载器是ClassLoader中的方法getSystemClassLoader()的返回值,所以又称为系统类加载器。`如果用户没有自定义类加载器,那么一般就默认使用此加载器。

三种类加载器相互配合实现加载,如下图各种加载器的层次关系构成了类加载器的双亲委派模型
11d8867741624909a5d83916c18cfbca-image.png

双亲委派模型的过程:
如果一个类加载器收到了加载某个类的请求,他首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去做,每个层次的类加载器都是如此,因此所有的家在请求都传到了顶层的启动类加载器,只有当父类反馈无法加啊在这个类的时候,子类才会尝试加载这个类。

双亲委派模型的实现:
实现在:Java.lang.ClassLoader的loadClass()方法中。1、先检查请求的类是否被加载过,没被加载则调用父加载器的loadClass()方法。2、若父加载器为空,则默认启用启动类加载器作为父类加载器。3、父类加载失败后,调用自己的findClass()方法进行加载。

使用双亲委派模型组织类加载器,使得Java类随加载器有了优先级的层次关系。

. - - —— ————THE END——— —— - - .

⚠求而不得,往往不求而得!
⚠此文章为原创作品,转载务必保留本文地址及原作者。

评论

发表评论

validate