11

好的,我知道我应该对我的特定应用程序进行基准测试和等等等等,但是:

-Xmx、默认垃圾收集器等的默认 JVM 设置是大多数典型 Java 程序的合理默认值,并且可能不适合惯用的 Scala 代码(部分原因是惯用的 Scala 会倾向于生成更多的“垃圾”) ”)。

因此,我正在寻找可供选择的建议。典型的 Scala 程序是否需要更高的 -Xmx 设置?某些 JVM 是否比其他 JVM 更适合 scala?与 Java 通常默认的相比,Scala 的不同垃圾收集器(-XX:+UseParallelGC vs XX:+UseConcMarkSweepGC)通常是更安全/更好/更快的猜测/赌注/默认值吗?对于 Scala 代码,我还应该特别考虑其他选项吗?以何种方式?

既然生成了更多的临时对象,那么是否应该默认给“年轻”一代更多的空间呢?还是应该减少通常给年轻代的空间来强制更频繁的垃圾收集?其他几代人呢?

当然,我仍然需要为我的特定应用程序调整这些东西,但通常我猜想对于一个典型的 Scala 程序,我的起点可能与 Java 中的不同。

我确实发现自己在某些特定应用程序中遇到了内存不足错误和“达到 GC 开销限制”,或者只是让应用程序在垃圾收集暂停上花费了太多时间。在某种程度上,我可以通过调整选项来解决这些问题,但我想听听其他经验、一般原则和起点。

4

2 回答 2

3

我在为 Eclipse IDE 优化 JVM 和 GC 设置时发现的一件事——更大的生成大小意味着当它最终收集它们时会有很大的停顿。

暂停显然是交互式应用程序的一大烦恼。这里的含义是使用较大的最大值但不强制使用较大的最小值。

我确实对 XX:+UseParallelGC 与 XX:+UseConcMarkSweepGC 进行了相当深入的比较——但那是在以前的计算机上。我最终在那台机器(单处理器)上使用了 XX:+UseConcMarkSweepGC,但对于多核机器来说,Parallel 显然是要走的路。

有趣的 GC 调优技巧:

IIRC,我确实发现 -XX:SurvivorRatio=2 或 -XX:SurvivorRatio=3 的“低值”可以提供显着的性能优势。我尝试的所有其他选项都没有明显的效果。

于 2012-10-07T09:14:03.277 回答
3

这是来自 scala 用户,因此纯粹基于个人经验。简而言之:我倾向于做很多 JVM 优化,因为我发现一点点努力可以让你走很长一段路,但我没有找到任何特定于 scala 的东西。

正如您所说,JVM 默认值充其量是合理的。设置适当的堆大小、选择正确的 GC、使用服务器 VM、调整生成大小等都可以提高 scala 应用程序的性能,就像它对普通 java 应用程序一样。这并不是说 java 和 scala 的配置文件是相同的,只是您的实际应用程序可能会产生更大的影响。

从理论上讲,我唯一期望重要的是新一代的大小,因为 scala 可能会产生更多的短期垃圾,而更大的新一代可以在这里对 VM 有所帮助。

于 2012-09-13T09:52:38.880 回答