JVM执行GC(垃圾回收)后操作系统内存占用是否会发生变化?
JVM GC后操作系统内存占用变动说明
JVM完成GC操作后,操作系统层面的内存占用绝大多数场景下不会立刻出现明显下降,仅在满足特定条件时才会发生变动,具体逻辑如下:
- GC的核心作用是回收JVM内部托管的堆内存中不再被使用的对象空间,这部分被回收的空间会先回到JVM自己管理的内存池中预留,供后续新对象申请使用,并不会直接返还给操作系统。此时从操作系统视角看,JVM进程的常驻内存占用不会发生变化,你提供的两张监测截图也可以对应这个表现:JVM堆内存的已使用量在GC后下降,但操作系统层面记录的JVM进程内存占用没有波动。
- 只有同时满足以下所有条件时,JVM才会将空闲的堆内存返还给操作系统,此时操作系统层面的内存占用才会出现下降:
- 使用支持内存归还能力的垃圾收集器:目前只有G1、ZGC、Shenandoah等较新的收集器支持主动归还内存,Parallel GC、CMS等老旧收集器默认几乎不会向操作系统返还已申请的内存。
- 配置了对应内存归还的JVM参数:比如G1需要配置
-XX:ShrinkHeapInSteps,ZGC需要配置-XX:ZUncommitDelay指定内存空闲多久后归还,没有开启对应参数的情况下不会触发归还操作。 - GC后堆内空闲内存的比例、空闲时长达到JVM设定的阈值,才会触发堆收缩和内存归还逻辑。
- 特殊场景下如果GC伴随类卸载、堆外内存回收操作,也可能导致操作系统层面的内存占用出现变动,但这不属于普通Young GC、Full GC的常规表现。
内容的提问来源于stack exchange,提问作者lethean
相关产品推荐
相关产品推荐

