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

Posted

技术标签:

【中文标题】JIT 是不是能够优化内存分配?【英文标题】:Is JIT capable to optimize memory allocation?JIT 是否能够优化内存分配? 【发布时间】:2016-01-01 20:33:44 【问题描述】:

这是来自 visualvm 的 GC 图,用于一个简单的应用程序,它通过 websocket 侦听一些传入的数据流......在开始时它会产生很多垃圾,但随着时间的推移它会变得更好......这是JIT 以某种方式找出如何避免创建对象?

【问题讨论】:

这是一条曲线。应用程序有什么作用?而且,请求模式是什么样的? 它打开一个websocket客户端,订阅一个频道,开始接收消息,其中90%是心跳(所以它们是相同的)... JIT 不会优化堆内存。然而 GC 有一些动态选项,因此 GC 更有可能响应脏对象的数量并在一段时间后更有效地清理它们。 有点相关——JIT 确实像 demonstrated by 真棒 JITWatch 一样进行逃逸分析。 【参考方案1】:

在一些非常特殊的情况下,JIT 可以移除分配,从而减少 GC 的压力。主要是escape analysis。基本上,如果对象只存在于一种方法中并且从不离开它,则可以将其分配在堆栈上而不是堆上,从而减少垃圾收集器的工作。 如果您想确定:您可以禁用转义分析:使用命令行参数-XX:-DoEscapeAnalysis 并查看图形是否发生变化。

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

【讨论】:

是的。在这种情况下,IMO 更可能是减少堆大小。 我知道堆栈限制,但是在应用程序预热后,JIT 在应用程序开始时最活跃,JIT 活动几乎为 0...令我惊讶的是,这种优化正在进行相当长的一段时间......就像一个小时,它变得越来越好......因此我认为可能还有其他一些我不知道的魔法......

以上是关于JIT 是不是能够优化内存分配?的主要内容,如果未能解决你的问题,请参考以下文章

内存分配

内存分配与回收策略

垃圾回收机制与内存分配

垃圾回收收集器与内存分配策略

6.1 内存机制及使用优化

jvmiz9是什么意思