Java类加载器

Java类加载器,第1张

Java类加载

目录

1、类的生命周期2、Java类加载器

2.1、定义2.2、分类2.3、双亲委派机制2.4、唯一性2.5、应用

1、类的生命周期


从类被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证 (Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7 个阶段。 其中验证、准备、解析 3 个部分统称为连接(linking)。
加载: 查找并加载类的二进制数据。(把类的.class 文件的二进制数据读入内存,存放在运行时数据区的方法区;类加载的最终结果是产生堆区中描述对应类的 Class 对象),加载类的时机并不需要等到某个类被主动使用时才加载,虚拟机会按需加载某个类。
连接: 包括验证、准备和解析三个子阶段

验证:确保补加载类的正确性准备:为类的静态变量分配内存,并设定默认值;解析:把类中的符号引用转换为直接引用;

初始化: 给类中的静态变量赋予正确的初始值,初始化时机如下

创建类(new、反射、克隆、反序列化);使用静态方法、非静态变量;Class.forName获取描述类的Class对象;

使用: 当初始化完成之后,java 虚拟机就可以执行 Class 的业务逻辑指令,通过堆中 java.lang.Class 对象的入口地址,调用方法区的方法逻辑,最后将方法的运算结果通过方法返回地址存放到方法区或堆中。
卸载: 清除对应类的Class对象和类的二进制数据结构。由Java虚拟自带的三个类加载器加载的类不能卸载,用户自定义的类加载器加载的类可以被卸载。

2、Java类加载器 2.1、定义

Java 类加载器的作用是寻找类文件,然后加载 Class 字节码到 JVM 内存中,连接(验证、准备、解析)并初始化,最终形成可以被虚拟机直接使用的 Java 类型。

2.2、分类


启动类加载器: 由 C++语言实现的类加载器,它负责将JAVA_HOME/lib-Xbootclasspath等虚拟机识别的类库加载到内存中。由于启动类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用。 具体可由启动类加载器加载到的路径可通过System.getProperty(“sun.boot.class.path”)查看所有的路径。
扩展类加载器: 由 Java 语言实现的类加载器(sun.misc.Launcher$ExtClassLoader),它负责将JAVA_HOME /lib/ext或者-Djava.ext.dir虚拟机识别的类库加载到内存中。开发者可以通过 System.getProperty(“java.ext.dirs”)查看所 有的路径。
应用/系统程序类加载器: 由 Java 语言实现的类加载器(sun.misc.Launcher$AppClassLoader),它负责将-classpath或者-Djava.class.path虚拟机识别的类库加载到内存中。开发者可以通过 System.getProperty(“java.class.path”)查 看所有的路径。可以通过-Djava.system.class.loader指定具体的应用/系统程序类加载器。

2.3、双亲委派机制


类加载过程中,会先从最顶层加载器(一般是启动类加载器)开始往下,先判断父类加载器能不能加载,能加载则往下传递返回加载的类;不能加载则继续往下判断,如果都不能加载,则会抛出 ClassNotFoundException异常;加载器之间的父子关系实际上是指加载器对象之间的包装关系,而不是类之间的继承关系;
优点:

避免类的重复加载(当父类加载器已经加载了,子类加载器就没有必要重复加载)。保护程序安全,防止核心API被随意篡改。

缺点:

顶层的类加载器无法访问底层的类加载器所加载的类。 2.4、唯一性

虽然任意一个类的类加载器只实现类的加载动作,但是都需要通过该类的加载器类本身共同确定该类的唯一性。

2.5、应用

层次划分、OSGI、热部署、代码加密等。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5703984.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存