1. 概述

JVM 默认的堆内存大小,在处理大文件或高并发请求时往往不够用。本文将介绍几种为基于 SBT 构建的项目配置 JVM 堆内存的方法。

⚠️ 以下方法适用于 SBT 1.0.0 及以上版本。

2. OutOfMemoryError 问题

Scala 应用在运行过程中会把对象存储在 堆内存(heap) 中。当我们处理大文件,或者在内存中创建了大量对象时,很容易遇到如下错误:

java.lang.OutOfMemoryError: Java heap space

这个错误说明我们试图使用的内存量超过了 JVM 堆内存的上限。由于 Scala 和 Java 都运行在 JVM 上,它们对堆内存的使用机制是相同的(Java 堆栈详解)。

3. 配置 SBT 的堆内存大小

配置 SBT 的堆内存和其他构建工具(如 MavenGradle)类似。JVM 提供了 多个参数 可供调整,其中最关键的是控制堆内存大小的参数。

推荐做法:通过 -Xmx 参数设置最大堆内存大小

例如,设置最大堆内存为 2GB:

$ export SBT_OPTS="-XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=2G -Xmx2G -Xms1G"

上面这行命令设置了:

  • -Xmx2G:最大堆内存为 2GB
  • -Xms1G:初始堆内存为 1GB
  • 其他参数用于优化类加载和永久代空间(适用于旧版本 JVM)

💡 小技巧:这种方式适合临时调试,如果想持久化配置,可以使用 .jvmopts 文件。

3.1 使用 .jvmopts 文件(推荐)

SBT 支持在项目根目录下创建一个名为 .jvmopts 的文件来指定 JVM 参数。例如:

$ cat .jvmopts
-Xms1g
-Xmx4g

这样每次运行 sbt 命令时都会自动加载这些配置,无需每次都手动设置环境变量,简单粗暴还方便团队共享。

4. 总结

本文介绍了两种为 SBT 项目配置 JVM 堆内存的方式:

  • ✅ 环境变量方式:适合临时调试
  • .jvmopts 文件:适合长期项目配置

合理设置堆内存大小,能有效避免 OutOfMemoryError,提升应用稳定性。踩过坑的同学都知道,早点配好比啥都重要。


原始标题:Kotlin Scope Functions