类的生命周期
加载
1、加载(Loading)阶段第一步是类加载器根据类的全限定名通过不同的渠道以二进制流的方式获取字节码信息。
程序员可以使用Java代码拓展的不同的渠道。
2、类加载器在加载完类之后,Java虚拟机会将字节码中的信息保存到内存的方法区中。在方法区生成一个
InstanceKlass对象,保存类的所有信息。
3、在堆中生成一份与方法区中数据类似的java.lang.Class对象, 作用是在Java代码中去获取类的信息
连接
⚫ 连接(Linking)阶段的第一个环节是验证,验证的主要目的是检测Java字节码文件是否遵守了《Java虚拟机规
范》中的约束。这个阶段一般不需要程序员参与。
⚫ 主要包含如下四部分,具体详见《Java虚拟机规范》:
1.文件格式验证,比如文件是否以0xCAFEBABE开头,主次版本号是否满足当前Java虚拟机版本要求。
2.元信息验证,例如类必须有父类(super不能为空)。
3.验证程序执行指令的语义,比如方法内的指令执行到一半强行跳转到其他方法中去。
4.符号引用验证,例如是否访问了其他类中private的方法等
⚫ 准备阶段为静态变量(static)分配内存并设置初值。final修饰的基本数据类型的静态变量,准备阶段直接会将
代码中的值进行赋值。
⚫ 解析阶段主要是将常量池中的符号引用替换为直接引用。符号引用就是在字节码文件中使用编号来访问常量池中
的内容。直接引用不在使用编号,而是使用内存中地址进行访问具体的数据。
⚫ 解析阶段主要是将常量池中的符号引用替换为直接引用。
⚫ 直接引用不在使用编号,而是使用内存中地址进行访问具体的数据。
初始化
⚫ 初始化阶段会执行静态代码块中的代码,并为静态变量赋值。
⚫ 初始化阶段会执行字节码文件中clinit部分的字节码指令。
类的卸载
判定一个类可以被卸载。需要同时满足下面三个条件:
1、此类所有实例对象都已经被回收,在堆中不存在任何该类的实例对象以及子类对象。
2、加载该类的类加载器已经被回收。
3、该类对应的 java.lang.Class 对象没有在任何地方被引用。
什么是类加载器,有哪些常见的类加载器
类加载器负载在类的加载过程中将字节码信息以流的方式获取并加载到内存中。JDK8及之前如下:
类加载器负载在类的加载过程中将字节码信息以流的方式获取并加载到内存中。JDK9之后均由Java实现:
⚫ 启动类加载器(Bootstrap ClassLoader)是由Hotspot虚拟机提供的类加载器,JDK9之前使用C++编写的、JDK9之
后使用Java编写。
⚫ 默认加载Java安装目录/jre/lib下的类文件,比如rt.jar,tools.jar,resources.jar等。
⚫ 扩展类加载器(Extension Class Loader)是JDK中提供的、使用Java编写的类加载器。JDK9之后由于采用了模块化,
改名为Platform平台类加载器。
⚫ 默认加载Java安装目录/jre/lib/ext下的类文件。
⚫ 应用程序类加载器(Application Class Loader)是JDK中提供的、使用Java编写的类加载器。默认加载为应用程序
classpath下的类。
⚫ 自定义类加载器允许用户自行实现类加载的逻辑,可以从网络、数据库等来源加载类信息。自定义类加载器需要继承自
ClassLoader抽象类,重写findClass方法
有几种类加载器?
1.启动类加载器(Bootstrap ClassLoader)加载核心类
2.扩展类加载器(Extension ClassLoader)加载扩展类
3.应用程序类加载器(Application ClassLoader)加载应用classpath中的类
4.自定义类加载器,重写findClass方法。
JDK9及之后扩展类加载器(Extension ClassLoader)变成了平台类加载器(Platform
ClassLoader)
什么是双亲委派机制
类加载有层级关系,上一级称之为下一级的父类加载器。
双亲委派机制指的是:当一个类加载器接收到加载类的任务时,会向上查找是否加载过,再由顶向下进行加载。
每个类加载器都有一个父类加载器,在类加载的过程中,每个类加载器都会先检查是否已经加载了该类,如果已经加载则直接返回,否则会将加载请求委派给父类加载器
每个类加载器都有一个父类加载器,在类加载的过程中,每个类加载器都会先检查是否已经加载了该类,如
果已经加载则直接返回,否则会将加载请求委派给父类加载器。
双亲委派机制有什么用?
什么是双亲委派机制?
双亲委派机制指的是:当一个类加载器接收到加载类的任务时,会向上交给父类加载
器查找是否加载过,再由顶向下进行加载。
双亲委派机制的作用:保证类加载的安全性,避免重复加载
打破双亲委派机制
ClassLoader中包含了4个核心方法:
ClassLoader中包含了4个核心方法,他们的调用关系如下:
ClassLoader中包含了4个核心方法,对Java程序员来说,打破双亲委派机制的唯一方法就是实现自定义类加载器
重写loadClass方法,将其中的双亲委派机制代码去掉。
ClassLoader中包含了4个核心方法,对Java程序员来说,打破双亲委派机制的唯一方法就是实现自定义类加载器
重写loadClass方法,将其中的双亲委派机制代码去掉
什么是双亲委派机制?
双亲委派机制指的是:当一个类加载器接收到加载类的任务时,会自底向上交给父类
加载器查找是否加载过,再由顶向下进行加载。
双亲委派机制的作用:保证类加载的安全性,避免重复加载。
打破双亲委派机制的方法:实现自定义类加载器,重写defineClass方法,将双亲委
派机制的代码去除。