3

我在 Heroku 上托管我的移动应用程序的后端。它是用 Scala 编写的,使用 Scalatra 来公开 REST API。除此之外,我正在运行一个工作程序,它获取数据并将其推送到 MongoHQ 的数据库(使用 casbah)。对于他们两个,我不断收到R14(超出内存配额)错误。在我的本地机器上,worker 消耗的内存不超过 200 - 250 MB,根据 New Relic 监控,Scalatra 应用程序在 Heroku 上仅使用了 250 MB。

这些是我的 Heroku 实例上的相关环境变量:

JAVA_OPTS: -Xmx384m -Xss512k -XX:+UseCompressedOops -javaagent:newrelic/newrelic.jar

JAVA_TOOL_OPTIONS:-Djava.net.preferIPv4Stack=true

SBT_OPTS: -Xmx384m -Xss512k -XX:+UseCompressedOops

回购:/app/.sbt_home/.ivy2/cache

Web 服务甚至还没有收到任何流量,那么为什么 Heroku 会抱怨内存消耗呢?

马可

4

1 回答 1

3

作为一个实验,尝试将 Scalate 排除在等式之外。理论上,如果您在没有 Scalate 模板的情况下运行(此类应用程序不需要),您应该能够运行 Scalatra REST API 并在 JVM 中使用大约 64MB。

如果不深入了解您的部署,就很难确切知道。但作为一种猜测,现在默认捆绑到 Scalatra 的默认 G8 模板中以提供预编译视图以提高生产速度的 Scalate 编译器可能会让您超出 Heroku 的限制。

可能有一种方法可以让模板预编译在 Heroku 部署过程之外工作,但我对 Heroku 部署或 Scalate 模板编译不够熟悉,不知道它是如何工作的。如果您使用 WAR 进行部署,则模板已经被预编译,并且您不会在第一次启动时受到惩罚。

于 2013-04-11T11:35:21.183 回答