深入理解Java虚拟机之回收方法区

深入理解Java虚拟机之回收方法区

      很多人认为在Java虚拟机中,方法区是不存在垃圾回收的,因此方法区也成为永久代,在Java虚拟机规范中的确没有要求方法区进行垃圾回收,这是因为方法区的垃圾回收“性价比”比较低,在堆中进行一次GC,往往可以回收75%到95%的空间,而在方法区中的回收效率远远低于此值。
      所以,方法区并不是没有垃圾回收,在方法区的垃圾回收主要分为两个部分:对废弃常量的回收和对不使用的类进行回收。

  • 对废弃常量的回收比较简单,基本上和堆里面的对象实例回收很相似,当一个常量没有任何地方引用的时候,就可以把这个常量进行回收掉了。例如在字符串常量池中有一个“abc”的字符串,如果没有任何一个String对象引用常量池中的“abc”字符串,那么当方法区发生内存回收而且必要的话,就会把“abc”字符串回收掉。常量池中其他的类、接口、方法、字段的符号引用也是这样。
  • 相对于对常量的判断,对一个类判断是否有用则要复杂许多,一个类要同时满足三个条件,才能被回收掉:
          1、这个类的所有实例都已经被回收掉了,在Java堆中不存在任何该类的实例。
          2、加载该类的ClassLoader已经被回收了。
          3、这个类对应的Class对象没有在任何地方被引用,无法通过反射的方法创建类对象或调用类的方法。
    满足这三个条件的类是可以被回收的。当然仅仅是可以,并不是必然要被回收。是否对类进行回收可以通过配置参数来配置,通过-Xnoclassgc进行控制,以及使用-verbose:classyiji -XX:+TraceClassLoading、-XX:+TraceClassUnLoading查看类加载和类卸载的信息。在大量使用反射、动态代理、动态生成JSP等频繁自定义ClassLoader的场景都需要虚拟机具备类卸载的功能,以此来保证方法区不会溢出。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值