java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java类加载与类卸载

Java中的类加载与类卸载方式

作者:m0_38063172

这篇文章主要介绍了Java中的类加载与类卸载方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

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类的整个生命周期就结束了。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文