类加载器ClassLoader
作用:负责装入类。一个java程序运行,至少需要三个类加载器实例,负责加载不同类。
- BootstrapClassLoader是JVM内核内嵌加载器,主要负载加载JAVA_HOME/lib下的类库。
- ExtensionClassLoader,父类加载器是Bootstrap,主要加载JAVA_HOME/lib/ext目录中的类库。
- App ClassLoader是应用程序类加载器,负责加载应用程序classpath目录下的所有jar和class文件。它的父加载器为Ext ClassLoader。
类的生命周期说明:第一阶段的加载由ClassLoader查找加载。
共7个步骤:加载->验证->准备->解析->初始化->使用->卸载
查看类对应的加载器
可以通过JDK-API查看:java.lang.class.getClassLoader();返回装载类的类加载器。但是如果该类的类加载器是BootstrapClassLoader,则返回null。
JVM如何知道我们的类在哪里
类不会重复加载
类的唯一性:类名一样且由同一个类加载器加载,代表是同一个类。
类的卸载
满足一下两个条件的类会被卸载:
- 该Class的所有实例都被GC回收;
- 加载该类的ClassLoader实例已经被GC回收;
验证方式:可以在jvm启动中增加参数-verbose:class,输出类的加载和卸载日志信息。
双亲委派模型
并非真正的父子类关系,可以理解为逻辑上下级关系。
为了避免重复加载,加载类时由下向上逐步委托,由上而下逐级查找,因此类不会重复被加载,且安全。