最近在看关于jvm运行原理简单了解了一下类加载器部分,欢迎有了解的朋友一起讨论。
先上一段关于jvm的类加载过程,关于类记载过程在《深入了解jvm虚拟机》一书中已经有过明确的解释,类的加载过程分为加载–>连接(验证、准备、解析)–>初始化–>使用–>卸载等过程。
关于前三个阶段做一下简单介绍,加载简而言之就是将一个类通过二进制字节流的形式读取到方法区;验证就是对这个二进制文件进行一系列的验证,防止文件被恶意篡改;准备就是为类变量分配内存并且设置类变量的初始值,这些变量所使用的内存都将在方法区中分配;解析就是将常量池中的符号引用变为直接引用;初始化就是对类进行初始化对静态变量赋值;
类加载器就是工作在第一个阶段–加载,目前类加载器分为两大类:
1.jvm的类加载器。
2.用户自定义的类加载器。
jvm的加载器又分为了三种分别是启动类加载器,扩展类加载器,应用程序类加载器。
另外用户可以自定义加载器,比较典型的例子就是在tomcat中tomcat的团队定义了自己的类加载器,打破了双亲委派的机制(关于双亲委派接下来会有介绍)。
这些加载器负责加载的内容如下:
1.Bootstrap ClassLoader/启动类加载器
主要负责jdk_home/lib目录下的核心 api 或 -Xbootclasspath 选项指定的jar包装入工作。
2.Extension ClassLoader/扩展类加载器
主要负责jdk_home/lib/ext目录下的jar包或 -Djava.ext.dirs 指定目录下的jar包装入工作。
3. System ClassLoader/系统类加载器
主要负责java -classpath/-Djava.class.path所指的目录下的类与jar包装入工作。
4. User Custom ClassLoader/用户自定义类加载器(java.lang.ClassLoader的子类)
在程序运行期间, 通过java.lang.ClassLoader的子类动态加载class文件, 体现java动态实时类装入特性。
关于这几种加载器的关系如图:
关于类的双亲委派机制就是当需要加载某个类的时候不会在当前的加载器中去寻找,而是交给父类加载器进行加载,如果父类加载器没有找到,父类加载器会继续找自己的父类加载器去寻找,直到到达启动类加载器还没有找到,便会往回找。
关于jvm运行机制--类加载器(一)
最新推荐文章于 2024-02-11 11:19:40 发布