使用SBT执行Lift项目时出现内存不足错误

16

我正在使用SBT 0.7.7版本。当我通过以下方式对我的Lift项目进行更改并重新编译:

  1. jetty-stop
  2. compile
  3. jetty-run

我遇到了以下错误:

在sbt执行期间发生错误:java.lang.OutOfMemoryError: PermGen space

我在 /opt/local/bin/sbt-0.7 下定义了以下内容:

# Is the location of the SBT launcher JAR file.
LAUNCHJAR="/opt/local/share/sbt-0.7/sbt-launch-0.7.7.jar"

# Ensure enough heap space is created for SBT.
if [ -z "$JAVA_OPTS" ]; then
JAVA_OPTS="-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled -XX:MaxPermSize=256m -Xmx512M -Xss2M"
fi

# Assume java is already in the shell path.
exec java $JAVA_OPTS -jar "$LAUNCHJAR" "$@"

可能是重复问题:这个问题 - Philippe
谢谢Philippe。我已经尝试将这些选项添加到我的sbt-0.7中,但我仍然收到这些错误。 - Hahnemann
2个回答

37
PermGen是构成Heap的许多空间之一。 您可以增加整个堆直到分配的部分足够大,也可以仅增加向PermGen空间分配的内存量。为了实现后者,请使用:
对于sbt 0.12.0:
``` export SBT_OPTS=-XX:MaxPermSize=256m ```
最好将其放入您的.bash_profile中(假设您正在使用bash)。
对于sbt 0.7:
在您的情况下,将-XX:MaxPermSize增加到超过256m的某个值。请记住,需要超过256m可能意味着存在其他问题。

1
SBT_OPTS=-XX:MaxPermSize=256m 对于 sbt 0.13.9 无效。而 SBT_OPTS=-Xmx1024M 则有效。 - robert

7

您需要允许Java分配更多的内存。

# You may need more or less depending on your project.
export SBT_OPTS=-Xmx1024M

您可能还需要重新查看一些其他内存设置。我正在运行SBT 0.11.2,并且只指定了Xmx。

顺便说一句,如果您在编译过程中确实遇到任何GC问题,我会感到惊讶。更改GC收集策略对于运行时间更长的进程更为相关。


3
“我会感到惊讶。” 那么我猜你是感到惊讶了,因为当我编译大型项目时,这种情况经常发生。“更适用于长时间运行的进程”... 你有没有编译过Scala? - Paul Draper
当您使用Slick与Slickless来描述大型数据库表时,这种情况肯定会发生。 - Andrew Norman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接