这是来自visualvm的GC图,用于通过websocket监听一些传入数据流的简单应用程序......在开始时它会产生大量垃圾,但正如你所看到的那样随着时间的推移会变得更好......这是JIT以某种方式弄清楚如何避免创建对象?
答案 0 :(得分:3)
有一些非常具体的案例,JIT可以删除分配,从而减轻GC的压力。主要是escape analysis。基本上,如果对象仅使用一个方法并且永远不会离开它,则可以在堆栈而不是堆上分配它,从而减少垃圾收集器的工作。
如果您想确切知道:您可以禁用转义分析:使用命令行参数-XX:-DoEscapeAnalysis
并查看图表是否更改。
然而,存在许多其他自我调整机制。就像运行时系统注意到你不需要那么多内存,因此开始减少堆大小。您的图表将与之匹配。由于大多数内存总是可以释放,因此内存系统会减小堆大小:使用更频繁但更小的GC。