✅ 一句话区别(面试时可直接用):
GC 是 JVM 自动回收内存的总称,而 Full GC 是其中一种最重的垃圾回收,会回收整个堆(包括新生代和老年代),开销最大、最容易造成卡顿。
🔍 详细解释(适合深入提问)
🔹 GC(Garbage Collection)
-
是广义上的垃圾回收过程
-
包括:
-
Minor GC(回收新生代)
-
Major GC(回收老年代,有时也叫 Old GC)
-
Full GC(最彻底,回收整个堆 + 方法区)
-
🔹 Minor GC(也叫 Young GC)
-
只回收 新生代(Eden + Survivor)
-
发生频率高,但速度快,影响小
-
触发条件:
-
Eden 区满了
-
新生对象分配失败
-
🔹 Full GC(全堆回收)
-
回收新生代 + 老年代 + 元空间(Metaspace)
-
一定是 STW(Stop The World)
-
最重的一种 GC,容易引发系统卡顿或延迟
-
触发条件:
-
老年代空间不足
-
调用
System.gc()
(默认会触发) -
CMS 回收失败或晋升失败
-
元空间(类元信息)满了
-
🧠 面试答题结构建议:
你可以按这套结构答:
✅ Q: GC 和 Full GC 有什么区别?
GC 是 JVM 自动内存回收机制的总称,具体分为 Minor GC、Major GC 和 Full GC。
Minor GC 只清理新生代,开销小,频率高
Full GC 是回收整个堆和元空间,代价最大,容易 STW
我们项目中如果 Full GC 频繁出现,一般说明老年代内存紧张,可能需要优化堆大小、对象生命周期,或检查是否代码中调用了System.gc()
。
📌 补充面试加分点:如何判断 & 优化 Full GC?
-
如何判断是否发生 Full GC?
-
查看 GC 日志(如
Full GC
字样) -
用 JVisualVM、Arthas、JFR 等工具监控
-
开启 GC 日志:
-Xlog:gc* (JDK9+) -XX:+PrintGCDetails (JDK8)
-
-
如何减少 Full GC?
-
优化对象创建,避免过早进入老年代
-
增大堆空间,减轻老年代压力
-
不手动调用
System.gc()
-
使用 G1、ZGC 等现代回收器代替 CMS/Parallel Old
-