在 Java 虚拟机中,类信息存放在方法区(Method Area)中,也叫作永久代(PermGen,Permanent Generation),该区域存储了类的信息、常量池、静态变量、即时编译后的代码等数据。
在 JDK 8 及以前的版本中,方法区是堆的一个逻辑部分,由于堆是由垃圾回收器负责回收的,因此方法区也会被垃圾回收器回收。在 JDK 8 之后,永久代被移除,取而代之的是元空间(Metaspace),它是一块在本地内存中的区域,同样存储类的信息、常量池、静态变量、即时编译后的代码等数据,但是元空间不再属于堆内存,也不会被垃圾回收器回收,而是由操作系统负责管理。
在 Java 应用程序运行期间,会不断加载和卸载类,如果类信息不再被使用,那么在经过垃圾回收器的标记清除过程后,其内存空间就会被回收。但是,在某些情况下,如果应用程序中使用了自定义的类加载器,那么加载的类信息可能不会被垃圾回收器回收,因为自定义的类加载器在加载完类信息后可能会持有对该类信息的引用,如果没有显式地释放这些引用,那么类信息可能会一直占用内存。因此,在使用自定义的类加载器时,需要注意释放类信息的引用,以避免内存泄漏。