我刚刚尝试了在jdk6-u18-XX:+DoEscapeAnalysis
VM(在 solaris 上)上启用的选项,但体验相当令人失望。我正在运行一个 scala 应用程序,它有很多演员(其中 20,000 个)。这是制造垃圾的秘诀!
通常,应用程序可以在 256Mb 的堆上运行,但会产生大量垃圾。在其稳定状态下:
- 在 GC 上花费 10% 的时间
- 在 <30 秒内生成 >150Mb 的垃圾,然后被 GC 处理
我认为逃逸分析可能会有所帮助,因此我启用了该选项并重新运行了该应用程序。我发现该应用程序越来越无法清除它收集的垃圾,直到它似乎最终将整个时间都花在了GC 上,并且该应用程序在其全部分配时“扁平化”了。
在这一点上,我应该说该应用程序没有抛出OutOfMemoryError
我所期望的。也许JConsole
(我用来执行分析)没有正确显示带有此选项的 GC 统计信息(我不相信)?
然后我删除了该选项并重新启动,应用程序再次变得“正常”!有人知道会发生什么吗?