方法区的垃圾回收

方法区的垃圾回收

  • 有人认为方法区(如HotSpot虚拟机中元空间或者永久代)是没有垃圾收集行为的,其实不然,Java虚拟机规范中堆方法区的约束是非常宽松的,提到过可以不要求虚拟机在方法区中实现垃圾收集,事实上也确实有未实现或未能完整实现方法区类型卸载的垃圾收集器存在(如JDK11时期的ZGC收集器就不支持类卸载)

  • 一般来说这个区域的回收效果比较难令人满意,尤其是类型的卸载,条件相当苛刻,但是这部分区域的回收有时又确实是必要的,以前Sun公司的bug列表中,曾出现若干严重的bug就是由于低版本的HotSpot虚拟机对此区域未完全回收而导致内存泄漏

  • 方法区的垃圾收集主要回收两部分内容:常量池中废弃的常量和不再使用的类型

  • 判定一个常量是否"废弃"还是相对简单,而要判定一个类型是否属于"不再被使用的类"的条件就比较苛刻了,需要同时满足下面三个条件

    • 该类的所有实例都已经被回收,也就是Java堆中不存在该类及其任何派生子类的对象
    • 加载该类的类加载器已经被回收,这个条件除非是经过精心设计的可替换类加载器的场景,如OSGI,Tomcat的重加载等,否则通常是很难达成的
    • 该类的Java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法
  • Java虚拟机被允许对满足上述三个条件的无用类进行回收(只是被允许)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

climb.xu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值