我刚刚在Solaris上运行了一个Scala应用程序,该程序有相当多的Actor(20,000个),并启用了JDK6-u18 VM(Java虚拟机)上的-XX:+DoEscapeAnalysis选项,但是结果令人失望。通常情况下,该应用程序可以使用256Mb的堆内存,但会生成大量垃圾。在其稳态时,它:
- 花费10%的时间进行垃圾回收 - 在不到30秒的时间内生成超过150Mb的垃圾,然后被GC回收
我认为逃逸分析可能有所帮助,因此我启用了该选项并重新运行了应用程序。我发现应用程序变得越来越无法清除所收集的垃圾,直到最终似乎花费了整个时间进行垃圾回收,并且应用程序在其完全分配的情况下“停滞不前”。
此时,我应该说一下,该应用程序没有抛出OutOfMemoryError,这让我感到意外。也许JConsole(我用于执行分析)在启用此选项时无法正确显示GC统计信息(我并不确信)?
然后,我删除了该选项并重新启动,应用程序又恢复了“正常”!有人知道可能发生了什么吗?
- 花费10%的时间进行垃圾回收 - 在不到30秒的时间内生成超过150Mb的垃圾,然后被GC回收
我认为逃逸分析可能有所帮助,因此我启用了该选项并重新运行了应用程序。我发现应用程序变得越来越无法清除所收集的垃圾,直到最终似乎花费了整个时间进行垃圾回收,并且应用程序在其完全分配的情况下“停滞不前”。
此时,我应该说一下,该应用程序没有抛出OutOfMemoryError,这让我感到意外。也许JConsole(我用于执行分析)在启用此选项时无法正确显示GC统计信息(我并不确信)?
然后,我删除了该选项并重新启动,应用程序又恢复了“正常”!有人知道可能发生了什么吗?
-server
,因为我在运行太阳能怪物上,所以 JVM 默认是服务器版的。是的,我正在使用 Scala 2.7.7。 - oxbow_lakes