1、类加载过程有5步,如图:

预加载:虚拟机启动时加载,加载的是JAVA_HOME/lib/下的rt.jar下的.class文件;
运行时加载:将用到的类的class对象加载到内存中;
2)、验证:确保Class文件的字节流中包含信息符合当前虚拟机要求,不会危害虚拟机自身安全。 主要包括四种验证,文件格式验证,元数据验证,字节码验证,符号引用验证;
3)、准备:为类变量(即static修饰的字段变量)分配内存并且设置该类变量的初始值为0
4)、解析:虚拟机将常量池内的符号引用替换为直接引用的过程;
符号引用(编译之后的UTF-8就是符号引用):一组符号来描述目标,可以是任何字面量;
直接引用:直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄。有类或接口的解析,字段解析,类方法解析,接口方法解析
5)、初始化:给static变量赋值以及执行静态代码块。
2、类加载器

主要加载的是JVM自身需要的类,负责将 <JAVA_HOME>/lib路径下的核心类库或-Xbootclasspath参数指定的路径下的jar包加载到内存中 只加载包名为java、javax、sun等开头的类;
2)、扩展(Extension)类加载器(Java语言实现、ExtClassLoader类):
用来加载 Java 的扩展库(jre/ext/*.jar); 3)、系统(System)类加载器(也称应用类加载器、AppClassLoader):
负责加载系统类路径java -classpath或-D java.class.path 指定路径下的类库, 是程序中默认的类加载器, 通过ClassLoader#getSystemClassLoader()方法可以获取到该类加载器;
4)、自定义类加载器(custom class loader):
通过继承 java.lang.ClassLoader类的方式实现自己的类加载器,以满足一些特殊的需求。
3、双亲委派机制:
工作原理如果一个类加载器收到了类加载请求,
它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行,
如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,
请求最终将到达顶层的启动类加载器,如果父类加载器可以完成类加载任务,就成功返回,
倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式。
优缺点:
好处:
1)、Java类随着它的类加载器一起具备了一种带有优先级的层次关系,
通过这种层级关可以避免类的重复加载,当父亲已经加载了该类时,就没有必要子ClassLoader再加载一次;
2)、保证java核心库的安全性,java核心api中定义类型不会被随意替换。
觉得不错,欢迎给一个赞!谢谢!