前言
类的生命周期包括,加载->验证->准备->解析->初始化->使用->卸载。在加载过程中,虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型。
类加载器
从JVM的角度来讲,只存在两种类加载器,启动类加载器(C++实现,加载native类,不可访问);另一种是其他所有类的加载器(Java实现,独立于虚拟机外,且全继承自java.lang.ClassLoader)。
- 启动类加载器:<JAVA_HOME>/lib,不可见
- 扩展类加载器:<JAVA_HOME>/lib/ext,可见
- 应用程序类加载器:它根据java的类路径来加载类,一般来说,java应用的类都是通过它来加载
JVM启动启动类加载器,启动类加载器启动扩展类加载器和应用程序加载器。
双亲委派机制
双亲委派机制:
- 收到了类加载请求,查看自己是否已加载,否则把请求委托给父加载器,每一层都是如此,所有的加载请求最终都传递到最顶层的类加载器进行处理;
- 如果父加载器不存在,尝试判断有没有被启动类加载器加载;
- 如果的确没有被加载,则再自己尝试加载。
对相同类的判断,不仅保证类全名相同,也要求加载这个类的类加载器相同,双亲委派是为了防止出现全名相同,但是由不同类加载器加载的情况,保证类的唯一性。
打破双亲委派机制,自定义类加载器,继承ClassLoader类,重写loadClass方法和findClass方法。
参考文章
Java虚拟机(JVM)你只要看这一篇就够了!
一篇图文彻底弄懂类加载器与双亲委派机制
jvm系列(一):java类的加载机制