Scala actor应用程序的奇怪GC行为

时间:2010-02-02 10:15:13

标签: scala garbage-collection jvm actor out-of-memory

3 个答案:

答案 0 :(得分:4)

你有理由期待你的堆慢慢增长吗?看起来两条痕迹都在增长。我在很多场合做过的一件事就是减少堆积,试图让问题变得更糟。但是,256M大约是Scala的下限。

我之前注意到的一件事是,如果你有短暂的物体,由于压力太大而使它从伊甸园一代中消失,它会逐渐杀死你。这可能发生在一阵活动时(也许你早上有爆发?)你的伊甸园空间不够大。一般来说Scala和特别是演员都会大量使用小型的短暂物体,而且一旦你穿过它,就会有这个神奇的门槛。因此,一次运行将会很好,下一次会崩溃并烧伤。

我之前注意到的另一件事是,在OSX / x86上运行良好的GC设置在Sparc / Solaris上通常不能很好地工作,反之亦然。如果您使用的是CoolThreads,我建议您将GC配置为在调度程序/池中为每个线程配置一个GC线程。

这带来了另一件事 - 确保调度程序不会无缘无故地创建新线程。它有时会这样做。我会说你应该几乎总是在线程上手动设置上限。我不知道它是多么相关,但是关于fork-join调度程序的一个有趣的事实是,默认情况下,actor使用它是用于短的CPU绑定任务。在它管理的线程中执行IO会搞砸其假设。当然它应该仍然有用,但是......

祝你好运!我已经失去了生命中的许多日子来解决这些问题。

在这里查看一些选项:http://java.sun.com/performance/reference/whitepapers/tuning.html

看起来您正在使用并发标记扫描收集器。尝试设置:

-XX:+UseParallelGC

答案 1 :(得分:1)

此时,我想知道是否值得尝试用Lift或Akka替换你的演员?虽然我认为它不太可能成为它们的一个错误,但它们可能不会发生导致崩溃的任何问题。

答案 2 :(得分:0)

从我的观点来看,堆布局是错误的。旧空间从最初的93M到高负荷的176不等。正如我从日志中看到的那样,你的生成平均约为50mb /秒。因此,如果您在完全gc上以176mb的点暂停约2秒钟,则您将没有年轻的空间来创建新对象。 我的建议:

  • 检查幸存者空间设置 - 您的旧空间增长到176M。 减少新空间 - 显然,这不是故意的
  • 将NewSize显式设置为所需的值,例如128M

  • 增加整体堆大小以提升对象,而不是执行完整的gc

  • 你有很长的停顿时间:gc 80mb> 50 ms,~120mb> 150ms。尝试CMS,我相信它会更快。(但做台架)