外观
讲一下对 GC 的了解
垃圾回收(Garbage Collection
, GC
)是 Java
虚拟机(JVM
)自动管理内存的机制,用于回收不再使用的对象,释放内存空间。
GC 的作用
- 自动内存管理:开发者无需手动释放内存,避免了内存泄漏和悬空指针等问题。
- 回收无用对象:
GC
会识别并回收不再被引用的对象(即垃圾对象)。 - 内存整理:某些
GC
算法会整理内存,减少内存碎片。
GC 的基本原理
- 可达性分析:
JVM
通过可达性分析算法判断对象是否存活。- 从
GC Roots
(如栈帧中的局部变量、静态变量等)出发,遍历对象引用链,未被引用的对象即为垃圾。
- 分代收集:
JVM
将堆内存分为年轻代(Young Generation
)、老年代(Old Generation
)和元空间(Metaspace
,Java 8+
)。- 不同区域使用不同的
GC
算法。
堆内存的分代
- 年轻代(
Young Generation
):- 存放新创建的对象。
- 分为
Eden
区和两个Survivor
区(S0 和 S1)。 - 使用
Minor GC
(年轻代GC
)回收。
- 老年代(
Old Generation
):- 存放长期存活的对象。
- 使用
Major GC
(老年代GC
)或Full GC
(整堆GC
)回收。
- 元空间(
Metaspace
):- 存放类的元数据(如类信息、方法信息等)。
- 在
Java 8
中取代了永久代(PermGen
)。
GC
算法
JVM
实现了多种 GC
算法,适用于不同的场景。
- 标记-清除(
Mark-Sweep
):- 标记所有可达对象,清除未标记的对象。
- 缺点:会产生内存碎片。
- 标记-整理(
Mark-Compact
):- 标记所有可达对象,将存活对象整理到内存的一端。
- 优点:减少内存碎片。
- 复制算法(
Copying
):- 将内存分为两块,每次只使用一块,存活对象复制到另一块。
- 优点:无内存碎片;缺点:内存利用率低。
- 分代收集(
Generational
):- 结合多种算法,年轻代使用复制算法,老年代使用标记-清除或标记-整理。
常见的垃圾回收器
JVM
提供了多种垃圾回收器,适用于不同的场景。
Serial GC
:- 单线程垃圾回收器,适用于单核
CPU
或小型应用。 - 参数:
-XX:+UseSerialGC
- 单线程垃圾回收器,适用于单核
Parallel GC
(吞吐量优先):- 多线程垃圾回收器,适用于多核
CPU
和高吞吐量场景。 - 参数:
-XX:+UseParallelGC
- 多线程垃圾回收器,适用于多核
CMS GC
(Concurrent Mark-Sweep
):- 并发垃圾回收器,减少停顿时间,适用于低延迟场景。
- 参数:
-XX:+UseConcMarkSweepGC
(Java 9
开始已弃用)
G1 GC
(Garbage-First
):- 面向服务端应用的垃圾回收器,平衡吞吐量和延迟。
- 参数:
-XX:+UseG1GC
ZGC
(Z Garbage Collector
):- 低延迟垃圾回收器,适用于大内存和低延迟场景(
Java 11+
)。 - 参数:
-XX:+UseZGC
- 低延迟垃圾回收器,适用于大内存和低延迟场景(
Shenandoah GC
:- 低延迟垃圾回收器,与
ZGC
类似(Java 12+
)。 - 参数:
-XX:+UseShenandoahGC
- 低延迟垃圾回收器,与
GC
的触发条件
Minor GC
:- 当年轻代的
Eden
区满时触发。
- 当年轻代的
Major GC / Full GC
:- 当老年代空间不足时触发。
- 当元空间不足时触发。
- 当调用
System.gc()
时(不推荐手动触发)。
GC
的性能指标
- 吞吐量(
Throughput
):- 应用程序运行时间占总时间的比例。
- 停顿时间(
Pause Time
):GC
过程中应用程序暂停的时间。
- 内存占用(
Footprint
):JVM
占用的内存大小。
总结
GC
是JVM
自动管理内存的核心机制。- 不同的垃圾回收器和算法适用于不同的场景。
- 通过合理配置和调优,可以提升应用程序的性能和稳定性。
- 监控和分析
GC
日志是优化内存使用的重要手段。