一.Java中的类加载器
Bootstrap ClassLoader (启动类加载器)
Bootstrap ClassLoader,启动类加载,默认加载的是jdk\lib目录下jar中诸多类.这个路径可以由-Xbootclasspath参数指定
Extension ClassLoader(扩展类加载器)
默认加载jdk/lib/ext/目录下的jar诸多类。这个路径可以使用java.ext.dirs系统变量指定
Application ClassLoader(应用类加载器)
应用类加载器,负责加载开发人员所编写的诸多类
User ClassLoader(自定义类加载器)
自定义类加载器解决上述加载器解决不了的特殊情况
二.双亲委派模型
在我们的系统中jvm加载类时,会把加载任务交给Application ClassLoader,而Application ClassLoader会尝试把任务交给Extension ClassLoad 加载,然而Extension ClassLoader又会把任务交给Bootstrap ClassLoader加载。Boostrap ClassLoad会在/jdk/lib下搜索是否存在,当不存在时会把加载任务层层下推,直至加载完成。
三.JVM类加载过程
java类加载分为5个过程,分别是:加载,链接(验证,准备,解析),初始化,使用,卸载。
加载主要是将.class文件通过二进制字节流读入到jvm中。再加载阶段需要完成一下3个工作通过ClassLoader在classpath中获取对应的class文件,将其以二进制流的形式读入内存。将字节流所代表的静态存储结构转化为方法区的运行时数据结构在内存中生成一个该类的java.lang.calss对象,作为方法区这个类的访问入口链接2.1 验证主要保证加载进来的字节流符合jvm的规范。验证阶段主要完成一下4个工作文件格式验证元数据验证(是否符合java语言规范)字节码验证(确保程序语义合法,符合逻辑)符号引用验证(确保下一步的解析能正常执行)2.2 准备主要为静态变量在方法去分配内存,并设置默认初始值2.3 解析将常量池中的服务引用替换为直接饮用的过程初始化初始化阶段时类加载过程中的最后一步,主要是根据程序中的赋值语句主动味蕾的变量赋值。当有继承关系时,先初始化父类在初始化子类,所以创建一个子类时其实内存中的存在两个对象的实例使用程序调用卸载jvm垃圾回收器回收器完成回收