方法区的垃圾回收

方法区的的垃圾收集主要包括两个部分:

废弃的常量:不可达的常量。

无用的类。

无用的类需要满足下列三个条件:

该类所有的实例已经被回收

该类对应的 Class 对象不可达。

加载该类的 ClassLoder 已经被回收

注意:上述条件中的 ClassLoder 是实例,而不是其对应的 Class 对象。

图示如下:

【应用:热部署】

热部署就是在运行时更新字节码文件。

如何进行热部署?

使用一个新的 ClassLoder 加载更新的 class 文件。可以使用监听器,检测到文件变动时,扫描到新的 ClassLoder,调用其相关方法加载更新类。

PS:ClassLoder 不能重复加载同一个 class 文件。

但是,如果某个旧类的实例无法被回收,比如哈希表中持有了这个对象,就会造成用内存泄漏,方法区内存堆积也会引起内存溢出。而且类的体系被打乱了,内存中无法被回收的类的实例,与其同名类的实例(新创建),因其 ClassLoder 不同,将永远不会 equals。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpxyyx.html