好的,我知道我应该对我的特定应用程序进行基准测试,等等,但是:
-Xmx 的默认 JVM 设置、默认垃圾收集器等,对于大多数典型的 Java 程序来说是合理的默认设置,并且可能不适合惯用的 Scala 代码(部分因为惯用的 Scala 会产生更多的“垃圾”)。
所以我正在寻找可供选择的建议。典型的 Scala 程序是否需要更高的 -Xmx 设置?某些 JVM 是否比其他 JVM 更适合 scala?与 Java 通常默认的相比,Scala 的不同垃圾收集器(-XX:+UseParallelGC vs XX:+UseConcMarkSweepGC)通常是更安全/更好/更快的猜测/赌注/默认值吗?对于 Scala 代码,我还应该特别考虑其他选项吗?以什么方式?
既然生成了更多的临时对象,那么默认情况下通常应该给“年轻”一代更多的空间吗?还是应该less 通常给年轻代空间以强制进行更频繁的垃圾回收?其他几代人呢?
当然,我仍然需要为我的特定应用程序调整这些东西,但通常我猜测,对于一个典型的 Scala 程序,我的起点可能与它在 Java 中的不同。
我确实发现自己在某些特定应用程序中遇到了内存不足错误和“达到 GC 开销限制”,或者只是让应用程序在垃圾收集暂停上花费了太多时间。在某种程度上,我可以通过调整选项来解决这些问题,但我想听听其他经验、一般原则和起点。
最佳答案
这是来自 scala 用户,因此纯粹基于个人经验。简而言之:我倾向于做很多 JVM 优化,因为我发现一点点努力可以让你走很长一段路,但我没有找到任何特定于 scala 的东西。
正如您所说,JVM 默认值充其量是合理的。设置适当的堆大小、选择正确的 GC、使用服务器 VM、调整生成大小等都可以提高 scala 应用程序的性能,就像它对普通 java 应用程序一样。这并不是说 java 和 scala 的配置文件是相同的,只是您的实际应用程序可能会产生更大的影响。
从理论上来说,我唯一希望关心的是新一代的大小,因为 scala 可能会产生更多的短期垃圾,而更大的新一代可能会在这里对 VM 有所帮助。
关于java - 惯用 scala 中 jvm 选项的指南,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12398046/