关于惯用语中的jvm选项的指导

nai*_*rbv 11 java memory garbage-collection jvm scala

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

-Xmx的默认JVM设置,默认垃圾收集器等,是大多数典型Java程序的合理默认值的默认值,可能不适合惯用的Scala代码(部分原因是惯用的Scala会产生更多"垃圾") ").

所以我正在寻找可供选择的建议.典型的Scala程序是否需要更高的-Xmx设置?某些JVM是否比其他JVM更适合scala?对于Scala来说,一个不同的垃圾收集器(-XX:+ UseParallelGC vs XX:+ UseConcMarkSweepGC)通常比Java中通常默认的更安全/更好/更快的猜测/下注/默认值吗?对于Scala代码,我应该考虑哪些其他选项,以什么方式?

由于生成了更多临时对象,默认情况下,"年轻"代通常应该有更多空间吗?或者应该给年轻一代带来更少的空间来强制更频繁的垃圾收集?其他几代呢?

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

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

sar*_*can 3

这是来自 scala 用户的,纯粹基于个人经验。简而言之:我倾向于做相当多的 JVM 优化,因为我发现一点点努力就能让你走得很远,但我还没有发现任何特定于 scala 的东西。

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

从理论上来说,我认为唯一重要的是新生代的大小,因为 scala 可能会产生更多短暂的垃圾,而更大的新生代可以对虚拟机有所帮助。