类加载和类加载器

类加载和类加载器

类加载、连接和初始化

理解类从加载、连接、初始化到卸载的生命周期

理解类加载、类加载器、理解双亲委派模型

理解并掌握各种主动使用类的初始化时机

  1. 类从被加载到JVM开始,到卸载出内存,整个生命周期如下图所示:

加载:查找并加载类文件的二进制数据

连接:就是将已经读入内存的类的二进制数据合并到JVM运行时环境中去,包含以下几个步骤:

  1. 验证:确保被加载类的正确性
  2. 准备:为类的静态变量分配内存,并初始化它们
  3. 解析:把常量池中的符号引用转换成直接引用
  4. 初始化:为类的静态变量赋初始值
  5. 使用: 看程序怎么写
    1. 卸载:退出程序

类加载要完成的功能:

  1. 通过类的全限定名来获取该类的二进制字节流
  2. 把二进制字节流转化为方法区的运行时数据结构
    1. 在堆上创建一个java.lang.Class对象,用来封装类在方法区内的数据结构,并向外提供了访问方法区内数据结构的接口

加载类的方式

最常见的方式:本地文件系统中加载,从jar等归档文件中加载

动态的方式:将java源文件动态编译成class

其他方式:网络下载,从专有数据库中加载等等

类加载器:

java虚拟机自带的类加载包括如下几种:

启动类加载器(BootstrapClassLoader)

平台类加载器(PlatformClassLoader) JDK8:扩展类加载器(Extension ClassLoader)

应用程序类加载器(AppClassLoader)

用户自定义的加载器:是 java.lang.ClassLoader 的子类,用户可以定制类的加载方式,只不过自定义类加载器其加载的顺序是在所有系统类加载器的最后

类加载器的关系

类加载器说明

启动类加载器:用于加载启动的基础模块类,比如:

java.base、java.management、java.xml等

平台类加载器:用于加载一些平台相关的模块,比如:

java.scripting、java.compiler、java.corba等等

应用程序类加载器:用于加载应用级别的模块,比如:

jdk.compiler、jdk.jartool、jdk.jshell 等等,还加载classpath路径中的所有类库

JDK8:启动类加载器:负责将/lib,或者-Xbootclasspath参数指定的路径中的,且是虚拟机识别的类库加载到内存中(按照名字识别,比如rt.jar,对于不能识别的文件不予加载)

JDK8:扩展类加载器:负责加载/lib/ext,或者java.ext.dirs系统变量所指定路径中的所有类库

JDK8:应用程序类加载器:负责加载classpath路径中的所有类库

java程序不能直接引用启动类加载器,直接设置classLoader为null,默认就使用启动类加载器

类加载器并不需要等到某个类,“首次主动使用”的时候才加载它,JVM规范允许类加载器在预料某个类将要被使用的时候就预先加载它

如果在加载的时候.class文件缺失,会在该类首次主动使用时报告LinkageError错误,如果一直没有被使用,就不会报错

---- The end of this article ----