直接用一句话回答:因为GC线程(尤其是垃圾回收的"标记-复制"和"扫描"操作)需要消耗大量的CPU计算资源来遍历、复制和整理内存对象,当GC频率过高时,这些计算操作会严重抢占应用线程的CPU时间。为了让你彻底理解,我从底层原理到实战案例拆解一下。一、为什么GC需要CPU?GC不是单纯的“搬砖”,而是复杂的计算过程:扫描与遍历(最吃CPU):GC Roots扫描和对象图遍历(走查引用链)是指针密集型操作,极其消耗CPU周期。复制与整理(内存操作):将存活对象从Eden/Survivor复制到新区域,涉及大量内存拷贝(memcpy),内存拷贝本质上是CPU进行的读写操作。屏障与拦截(额外开销):G1、CMS等并发收集器在执行时会插入写屏障(Write Barrier),每次赋值操作都多执行几行指令。并发标记阶段,GC线程会轮询这些屏障记录,增加CPU开销。二、GC变“频繁”是如何“榨干”CPU的?1. 频次爆炸:从“收垃圾”变成“翻垃圾”假设一次YGC(年轻代垃圾回收)需要20ms,CPU占用30%。正常情况:每隔5秒触发一次 → 1分钟内跑12次,总耗时240ms → CPU影响微乎其微。频繁情况:对象分配过快,每隔100ms触发一次 → 1分钟内跑600次,总耗时12秒!这意味着每秒钟有200ms在纯跑GC逻辑,CPU直接飙升。2. 线程争抢:STW(Stop-The-World)加剧了CPU饥饿在Young GC和Full GC期间,所有应用线程(业务线程)会被暂停。当GC频繁发生时:多核CPU上,应用线程被暂停,只剩下GC线程在跑(且GC线程通常需要并行计算)。操作系统调度器看到GC线程一直在运行,会分配大量的CPU时间片给它们。如果你用top -Hp查看,会看到GC线程(如G1 Young RemSet、Concurrent Mark)的CPU占用率极高。3. 不同GC策略导致的CPU消耗差异