深入解答
GC 停顿的根本原因是需要遍历和移动对象。在 L5(内存层次)层面,GC 需要扫描堆中的对象,大堆(数 GB)的扫描会导致缓存未命中和主存访问(100ns/次);在 L8(操作系统)层面,Stop-the-World GC 需要暂停所有应用线程,以便安全地移动对象和更新引用;在 L10(程序设计)层面,对象引用关系复杂,GC 需要追踪所有可达对象,标记-清除算法会产生内存碎片,压缩算法需要移动对象(更新所有引用)。优化策略:分代回收(年轻代频繁回收,老年代偶尔回收)、并发 GC(应用线程和 GC 线程并行执行,如 G1、ZGC)、Region-based 内存管理(将堆划分为多个区域,减少停顿时间)。