方法区的的垃圾收集主要包括两个部分:
废弃的常量:不可达的常量。
无用的类。
无用的类需要满足下列三个条件:
该类所有的实例已经被回收。
该类对应的 Class 对象不可达。
加载该类的 ClassLoder 已经被回收
注意:上述条件中的 ClassLoder 是实例,而不是其对应的 Class 对象。
图示如下:
【应用:热部署】
热部署就是在运行时更新字节码文件。
如何进行热部署?
使用一个新的 ClassLoder 加载更新的 class 文件。可以使用监听器,检测到文件变动时,扫描到新的 ClassLoder,调用其相关方法加载更新类。
PS:ClassLoder 不能重复加载同一个 class 文件。
但是,如果某个旧类的实例无法被回收,比如哈希表中持有了这个对象,就会造成用内存泄漏,方法区内存堆积也会引起内存溢出。而且类的体系被打乱了,内存中无法被回收的类的实例,与其同名类的实例(新创建),因其 ClassLoder 不同,将永远不会 equals。