在此链接上,据说:
这些暂停是压缩堆以释放空间的必然要求的结果。收集器使用不同的策略来延迟这些事件,但是对于所有商业可用的收集器来说,压缩是不可避免的。
我的印象是,如果你保持应用程序的内存占用不变,那么就不需要发生 GC 压缩,换句话说,只有在你不断添加和收集对象时才会发生。如果您有足够大的堆和足够的可用空间,为什么在不创建任何孔(即不产生任何垃圾)时需要压缩?
我知道为 Java 应用程序保持恒定的内存占用并不容易,但使用正确的分析工具、引导程序和纪律是可能的。
那么假设 Java 应用程序可以在没有任何 GC 引入的延迟(换句话说,没有 GC 暂停)的情况下运行恒定的内存占用不是合理的吗?
编辑:通过不断的内存占用,我的意思是steady state
Ajay George 提到的,当没有更多的对象被创建或取消引用时。如果你继续创建对象,你最终会耗尽内存,如果你继续取消引用对象,你最终会触发 GC。所以最终目标是启动、预热、强制进行完整的 GC,然后进入稳定状态以进行生产时间。