欢迎光临散文网 会员登陆 & 注册

JVM的类加载

2021-03-17 09:50 作者:光耀三十洲  | 我要投稿

宏观的看java程序的执行

JAVA是如何运行的.png

平时我们写好的java代码都是以.java作为后缀结尾的。我们要把这些代码放到线上运行就要对他们进行打包,打成jar包。然后里面的.java文件就会被编译成.class。然后我们会使用类加载器把这些.class的字节码文件加载到JVM中。然后JVM会用内部的字节码执行引擎来执行字节码。当我们需要哪个类类加载器就会从.class文件加载对应的类。

学习更多知识,请点击:https://www.bilibili.com/video/BV1Li4y1P764/

                                       https://www.bilibili.com/video/BV1yy4y147TY/

                                       https://www.bilibili.com/video/BV1yp4y1H7na/

                                       https://www.bilibili.com/video/BV1gA411T7cc/

类加载的步骤

  1. 加载: 当我们要用到这个类的时候,比如类里的main方法入口,或者new了其他类我们就会通过这个类的全限定类名,获取定义这个类的字节流。java的类加载器就实现通过类的全限定类名类获得这个类的字节流这个动作。

  2. 验证:检查加载进来的.class文件是否符合Java虚拟机规范。

  3. 准备: 为静态变量分配内存,并且为静态变量设置初始值。

  4. 解析:将符号引用替换为直接引用。

  5. 初始化: 执行类构造器的clinit()方法。clinit方法会自动收集java中类变量的赋值动作和静态代码块。


    学习更多知识,请点击:https://www.bilibili.com/video/BV1Li4y1P764/

                                           https://www.bilibili.com/video/BV1yy4y147TY/

                                           https://www.bilibili.com/video/BV1yp4y1H7na/

                                           https://www.bilibili.com/video/BV1gA411T7cc/

类加载器的双亲委派机制

有哪些类加载器?

  1. 启动类加载器:BootStrap ClassLoader:负责加载最核心的类库。当JVM启动的时候,就会依托Bootstrap classloader类加载器去加载核心类。

  2. 扩展类加载器 : extension ClassLoader :负责加载lib\ext目录下的类。

  3. 应用程序类加载器: application ClassLoader: 负责加载ClassPath环境变量下指定的的路径中的类。

  4. 自定义的类加载器: 自己定义的类加载器去

双亲委派机制

双亲委派机制是类加载器之间一个非常重要的机制。

工作流程:

一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派給父类加载器去完成,每一个层次的类加载器都是如此。需要注意的是父子类加载器之间的这种关系不是继承的关系来实现的,而是组合的关系来实现的。所有的类加载器的请求都会传送到顶层的Bootstrap classloader里。只有当父类加载器无法完成这个加载请求,因为它的搜索范围没有找到所需要的类的时候,子加载器才会尝试自己去完成加载。

使用双亲委派机制来组织类加载器之间的关系,的显而易见的好处就是Java中的类随着它的类加载器具备了一种自带优先级的关系。例如java.lang.Object类,无论哪一个类加载器都要加载这个类,最终都会委派处于模型最顶端的启动类加载类解析加载,所以Object在各个类加载环境中都能够保证是同一个类,如果没有使用双亲委派机制,如果用户也编写一个java.lang.Object放在ClassPath中,那系统会出现多个不同的object类。

学习更多知识,请点击:https://www.bilibili.com/video/BV1Li4y1P764/

                                       https://www.bilibili.com/video/BV1yy4y147TY/

                                       https://www.bilibili.com/video/BV1yp4y1H7na/

                                       https://www.bilibili.com/video/BV1gA411T7cc/

接下来这张图就是类加载的流程图

JVM类加载流程图 (1).png

破坏双亲委派机制

有的时候我们也需要打破双亲委派机制。举个例子,在Tomcat中我们就打破了双亲委派机制。Tomcat的类加载机制是如何设计的呢?为什么要破坏呢?

因为我们的web容器可能会同时部署多个程序,他们依赖的库也有来源于不同的版本的,所以我们对于每一个部署的程序都应该是独立的。

学习更多知识,请点击:https://www.bilibili.com/video/BV1Li4y1P764/

                                       https://www.bilibili.com/video/BV1yy4y147TY/

                                       https://www.bilibili.com/video/BV1yp4y1H7na/

                                       https://www.bilibili.com/video/BV1gA411T7cc/

我们来看Tomcat是如何实现的: 具体查阅《深入理解JVM》9.2

tomcat类加载器.png

学习更多知识,请点击:https://www.bilibili.com/video/BV1Li4y1P764/

                                       https://www.bilibili.com/video/BV1yy4y147TY/

                                       https://www.bilibili.com/video/BV1yp4y1H7na/

                                       https://www.bilibili.com/video/BV1gA411T7cc/

作者:vegetabledog
链接:https://juejin.cn/post/6939875539175866398
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


JVM的类加载的评论 (共 条)

分享到微博请遵守国家法律