有配置的。不过这个与收集器和版本相关,所以能否满足你的期望不好说。
在JDK 8及之前,哪怕GC之后占用内存下降,得到的内存空间也仅仅是从Used转变为Committed,在JVM一侧看这些已经是空闲内存了,但在OS一侧看来,仍然是被JVM占用的状态。
从JDK 9起,加入了ShrinkHeapInSteps参数,或者说修复了以前的UseAggressiveHeapShrink参数的问题(
https://bugs.openjdk.java.net/browse/JDK-8146436),让OS一侧能看到JVM主动释放的内存。
但这个行为必须是与具体收集器相关的,其他几款收集器的改进并不活跃,G1在这个时期有改动,让它在FullGC时顺带Decommit空闲内存回OS(
https://bugs.openjdk.java.net/browse/JDK-8038423)。
不过,以上改进仍然是效果很差,因为G1是并发增量收集,FullGC是很罕见的,所以通常加了这个参数也不容易见到效果。
到了JDK 12,发布了JEP 346(
https://openjdk.java.net/jeps/346),这个JEP的改进就是让G1能在正常的不产生FullGC的收集循环中,也能自动Decommit空闲内存回OS(通过G1PeriodicGCInterval参数),后来的Shenandoah收集器也共用了这部分代码。
到了JDK 13,ZGC默认就有Decommit行为,不需要额外参数了。
--
FROM 14.123.255.*