JVM 类加载器、双亲委派原理

类加载器ClassLoader

作用:负责装入类。一个java程序运行,至少需要三个类加载器实例,负责加载不同类。

  1. BootstrapClassLoader是JVM内核内嵌加载器,主要负载加载JAVA_HOME/lib下的类库。
  2. ExtensionClassLoader,父类加载器是Bootstrap,主要加载JAVA_HOME/lib/ext目录中的类库。
  3. App ClassLoader是应用程序类加载器,负责加载应用程序classpath目录下的所有jar和class文件。它的父加载器为Ext ClassLoader。

类的生命周期说明:第一阶段的加载由ClassLoader查找加载。

共7个步骤:加载->验证->准备->解析->初始化->使用->卸载
在这里插入图片描述

查看类对应的加载器

可以通过JDK-API查看:java.lang.class.getClassLoader();返回装载类的类加载器。但是如果该类的类加载器是BootstrapClassLoader,则返回null。

JVM如何知道我们的类在哪里

类不会重复加载

类的唯一性:类名一样且由同一个类加载器加载,代表是同一个类。

类的卸载

满足一下两个条件的类会被卸载:

  1. 该Class的所有实例都被GC回收;
  2. 加载该类的ClassLoader实例已经被GC回收;
    验证方式:可以在jvm启动中增加参数-verbose:class,输出类的加载和卸载日志信息。

双亲委派模型

并非真正的父子类关系,可以理解为逻辑上下级关系。
为了避免重复加载,加载类时由下向上逐步委托,由上而下逐级查找,因此类不会重复被加载,且安全。
在这里插入图片描述

posted @ 2023-03-05 13:12  maoxianww  阅读(17)  评论(0编辑  收藏  举报