这里暂时只做汇总式的解答,建议进一步阅读《实战Java虚拟机:JVM故障诊断与性能优化》、《深入理解Java虚拟机:JVM高级特性与最佳实践》。
1、先看一下类的生命周期
加载 – 连接 – 初始化 – 使用 – 卸载
2、加载
类加载,指的是将类的.class文件中的二进制数据读入到内存中,把它放进运行时数据区的方法区内(Perm区)。
然后在堆区创建一个java.lang.Class对象,封装这个类在自身的方法区内的数据结构。
类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区(Perm区)内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。
注意,这是仍旧没有生成针对该类的对象。后续对类的实例化,会使用堆内存中的Class对象生成具体的实例对象。
3、卸载
如果有下面的情况,类就会被卸载:
1、该类所有的实例都已经被回收,也就是java堆中不存在该类的任何实例。
2、加载该类的ClassLoader已经被回收。
3、该类对应的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法。
如果以上三个条件全部满足,jvm就会在方法区垃圾回收的时候对类进行卸载,类的卸载过程其实就是在方法区中清空类信息,java类的整个生命周期就结束了。