Java中的类加载与类卸载方式
作者:m0_38063172
Java中的类加载与类卸载
类加载
Java中的代码都写在类里面,源代码(.java文件)经过编译后会变成字节码(.class文件),当Java应用程序运行时,JVM会加载要用到的类。
负责类加载的是java.lang.ClassLoader的对象,ClassLoader的对象会根据类的binary name(不知道怎么翻译,二进制名?)来读取类的字节码,然后把这些字节码加载到JVM的方法区里,同时会在heap里面创建一个Class对象,这个Class对象是类的元数据和它的对象通信的接口。
类在heap中的Class对象和加载它的ClassLoader对象之间有强引用。
类卸载
不像类加载,Java中没有提供显式进行类卸载的API,但是如果加载类的ClassLoader对象被垃圾回收器回收的话,这个类就会被卸载。
所以我们可以自己实现ClassLoader,自己加载类,然后对ClassLoader对象的引用赋值为null,等ClassLoader对象剩下的引用数量为0时会被回收,这样就达到卸载类的目的了。
什么是类加载?什么时候卸载?
1.先看一下类的生命周期
加载 – 连接 – 初始化 – 使用 – 卸载
2.加载
类加载,指的是将类的.class文件中的二进制数据读入到内存中,把它放进运行时数据区的方法区内(Perm区)。
然后在堆区创建一个java.lang.Class对象,封装这个类在自身的方法区内的数据结构。
类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区(Perm区)内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。
注意,这是仍旧没有生成针对该类的对象。后续对类的实例化,会使用堆内存中的Class对象生成具体的实例对象。
3.卸载
如果有下面的情况,类就会被卸载:
1、该类所有的实例都已经被回收,也就是java堆中不存在该类的任何实例。
2、加载该类的ClassLoader已经被回收。
3、该类对应的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法。
如果以上三个条件全部满足,jvm就会在方法区垃圾回收的时候对类进行卸载,类的卸载过程其实就是在方法区中清空类信息,java类的整个生命周期就结束了。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。