JIT 是否能够优化内存分配?

Is JIT capable to optimize memory allocation?

这是来自 visualvm 的 GC 图,用于一个简单的应用程序,该应用程序通过 websocket 侦听一些传入的数据流...开始时它会产生大量垃圾,但正如您所见,它会随着时间的推移变得更好...这个 JIT 是否想出了如何避免创建对象的方法?

有一些非常特殊的情况,JIT 可以删除分配,从而减轻 GC 的压力。主要以escape analysis为主。基本上,如果对象只存在于一个方法中并且永远不会离开它,那么它可以分配在堆栈而不是堆上,从而减少垃圾收集器的工作。 如果您想确定:您可以禁用逃逸分析:使用命令行参数 -XX:-DoEscapeAnalysis 并查看图表是否发生变化。

然而,还有许多其他自调整机制。就像运行时系统注意到您不需要那么多内存,因此开始减少堆大小。你的图表会匹配那个。由于大部分内存总是可以被释放,内存系统减少了堆大小:更频繁但更小的 GC。