深入理解JAVA虚拟机—第三章垃圾收集器和内存分配策略(三)关于回收方法区

关于回收方法区

  • 很多人认为方法区中是没有垃圾收集的,其实JVM规范中确实说过方法区可以不用实现方法区垃圾收集,而且在方法区中进行垃圾收集的效果也不是特别好,在新生代中,常规进行一次垃圾收集,一般可以收集70%-95%的空间,而且永久代的垃圾收集效率远低于此。
  • 永久代中的垃圾主要是分成两个部分:废弃常量和无用的类。回收废弃常量与回收java堆中的对象非常类似,以常量池中字面量为例,例如一个字符串“abc”已经进入了常量池中,但是当前系统没有一个String对象叫做“abc”的,那么这个“abc”其实已经没有任何一个对象引用了,这个时候发生方法区垃圾回收,那么这个“abc”就会被系统清理出常量池。常量池中的其他类,方法,字段符号引用也和这个类似
  • 判断一个常量是否是废弃常量比较简单,但是如果判断一个类是否废弃,就比较困难了,判断没用的类主要需要一下3个条件:

    1)该类所有的实例都已经被回收,Heap中所有该类的实例对象都被回收。
    2)加载该类的ClassLoader对象已经被回收。
    3)改类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法

  • 类在满足以上3个条件的时候,就可以被回收了,但是和对象不一样,是否需要回收无用的类,HotSpot虚拟机提供了一系列参数控制。

  • 在大量使用反射、动态代理的场合,以及动态生成jsp和OSGi这类频繁定义ClassLoader的场景都需要定义虚拟机具备类卸载功能,保证方法区(HotSpot中的永久代)不会溢出
    原文作者:java虚拟机
    原文地址: https://blog.csdn.net/qq_16550909/article/details/82320696
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞