Full Garbage Collection与Major Garbage Collection的区别及疑问
关于Oracle GC文档中Full GC与PermGen的疑惑解答
嘿,这个疑问太典型了!我刚接触Oracle JVM垃圾回收的时候也有过一模一样的困惑,咱们一步步拆解清楚:
首先得明确这几个GC术语的严谨定义,很多资料会把它们混着说,但Oracle文档这里的区分很关键:
- Minor GC:只针对年轻代(Eden区+Survivor区)的垃圾回收,速度快、触发频繁,主要清理生命周期短的临时对象。
- Major GC:针对老年代的垃圾回收,速度比Minor GC慢很多,触发频率低,回收那些存活时间长的对象。
- Full GC:这是覆盖范围最广的GC操作——同时回收年轻代、老年代,以及你提到的永久代(PermGen)。
为什么文档之前只提Minor和Major呢?因为日常GC场景里,这两种已经覆盖了绝大多数常规回收需求。而PermGen的回收触发条件比较特殊:它存储类元数据、常量池这些内容,只有当PermGen空间不足,或者某些Major GC完成后JVM判断需要清理PermGen,或者显式调用System.gc()(生产环境极不推荐)的时候,才会触发Full GC,顺带清理PermGen里不再被引用的类数据。
文档里特意强调“永久代会被包含在Full Garbage Collection中”,核心意思就是:只有Full GC会处理PermGen的回收,Minor GC和普通的Major GC都不会扫描或清理PermGen空间。
另外补充个小知识点:Java 8及以后的版本里,PermGen已经被元空间(Metaspace)取代了,但元空间的回收逻辑和PermGen类似,通常也只有在Full GC的时候才会被清理。
内容的提问来源于stack exchange,提问作者Brixton Weiss
相关产品推荐
相关产品推荐

