题目
方法区会发生垃圾回收吗
答案
JVM 方法区是用来存储类信息、常量、静态变量等数据的区域,它在虚拟机启动时被创建,其大小一般是固定的,由启动参数决定。在 JDK 8 之前,方法区是作为永久代存在的,而在 JDK 8 之后,永久代被元空间(Metaspace)所取代。
方法区是存在垃圾对象的,比如已经被卸载的类的信息、常量池中不再被使用的常量等,这些对象理论上是可以被 GC 回收的。在 JDK 8 之前,方法区也会发生 Full GC,因为方法区的内存是有限的,如果过多的类信息、常量等不能被回收,就会导致 OOM。
而**在 JDK 8 及之后的版本,永久代被元空间所取代,元空间使用的是本地内存(或者说是 “堆外内存”),它的大小是由系统的内存大小决定的,因此在 JDK 8 及之后的版本中,永久代不再会发生 Full GC**。
