xmsx

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

  1. 废弃的常量:不可达的常量。
  2. 无用的类。

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

  1. 该类所有的实例已经被回收。
  2. 该类对应的 Class 对象不可达。
  3. 加载该类的 ClassLoder 已经被回收

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

图示如下:

mark


【应用:热部署】

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

如何进行热部署?

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

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

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

分类:

Java

技术点:

相关文章:

  • 2022-03-06
  • 2022-03-02
  • 2021-09-09
  • 2022-01-16
  • 2021-10-04
  • 2021-06-22
  • 2021-05-06
猜你喜欢
  • 2021-06-18
  • 2021-05-26
  • 2022-03-05
  • 2021-10-08
  • 2021-11-10
  • 2021-06-23
相关资源
相似解决方案