【问题标题】:Scala 2.10 compiler takes 10x longer after first time in SBTScala 2.10 编译器在 SBT 中的第一次使用时间增加了 10 倍
【发布时间】:2013-03-14 17:19:39
【问题描述】:

我正在将一些代码从 2.9.1 更新到 2.10.0(我尝试了 2.10.1,结果相同),在这两种情况下都使用 SBT 0.12.1。

当我在命令行上运行sbt clean compile 时,它们都在大约 250 秒后完成。

但是,当我以交互方式运行 sbt 并重复输入 clean 然后 compile 时,我的 2.9 编译变得更快,但我的 2.10 编译变得慢了 10 倍

如果我使用 768m 的堆大小,2.10 在第 3 次编译时内存不足。堆大小为 4g,每次都能编译,但在第一次迭代后总是慢 10 倍。

[success] Total time: 258 s, completed Mar 14, 2013 10:44:34 AM
[success] Total time: 2048 s, completed Mar 14, 2013 11:23:03 AM
[success] Total time: 2049 s, completed Mar 14, 2013 11:58:42 AM
[success] Total time: 2047 s, completed Mar 14, 2013 12:43:19 PM

对我来说,调试以了解发生了什么的最佳方式是什么?

【问题讨论】:

标签: scala scala-2.10


【解决方案1】:

感谢CodeCache link 的改名。我最初忽略了它,因为使用它建议的 -XX:+UseCodeCacheFlushing 选项没有任何改进,但我只是尝试使用 -XX:ReservedCodeCacheSize=2g 并解决了问题。

有谁知道为什么-XX:+UseCodeCacheFlushing 没有帮助,或者所有代码缓存 java 选项的一些推荐值?

为了好玩,这是我使用 -XX:+HeapDumpOnOutOfMemoryError -server -XX:ReservedCodeCacheSize=2g -Xmx4g -Xss4M -XX:MaxPermSize=512M -XX:+DoEscapeAnalysis -XX:+UseCompressedOops -XX:+CMSClassUnloadingEnabled -XX:+UseCodeCacheFlushing 生成的编译时间

2.10.1 (interactive, repeating clean/compile)
    194 s
    149 s
    95 s
    87 s
    84 s
2.9.1 (interactive, repeating clean/compile)
    187 s
    129 s
    83 s
    77 s
    74 s
2.10.1 (batch sbt clean compile)
    195 s
2.9.1 (batch sbt clean compile)
    177 s

【讨论】:

  • -XX:ReservedCodeCacheSize 设置为 128m 和 2g 一样好
【解决方案2】:

您可以从附加分析器或监视器开始,以查看 GC 发生了什么。要初步了解像 JVisualVM 这样的库存工具,应该就足够了。当然,如果你有 YourKit,那也很好用。

附录

除了有点有趣但现在基本上无关紧要之外,我最近发现 Scala 2.9.0-1 在编译 Specs2 测试时速度非常慢(至少是不可变的)。切换到 2.9.1 带来了巨大的变化。当我不得不向以前没有任何单元测试的项目添加一些单元测试并且编译时间变得痛苦时,我才注意到它。预感我切换到 2.9.1,一切恢复正常。

【讨论】:

  • 我用 jvisualvm 看了。 GC 似乎没有任何可疑之处(堆有足够的可用空间,没有花太多时间在 GC 上)。 CPU 采样对我来说也没有多大意义(23% 的时间在 Object.hashCode 中,其余时间
猜你喜欢
  • 1970-01-01
  • 2014-05-04
  • 2012-10-06
  • 2015-11-29
  • 1970-01-01
  • 2014-04-25
  • 2011-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多