只是坐在没有请求的情况下,我的内存不断增加,最终超出了内存配额。有很多事情我不明白。
- 为什么没有请求时内存使用量不断增加?
- “进程运行内存”的值从何而来(据我所知,这似乎不是堆和非堆使用情况中数字的任何组合的总和)。
- 即使我有推荐的
JAVA_OPTS: -Xmx384m -Xss512k -XX:+UseCompressedOops -javaagent:heroku-javaagent-1.2.jar=stdout=true
,为什么它仍然超出?
这是日志文件的示例
app/web.1: heroku-javaagent: JVM Memory Usage (Heap): used: 275M committed: 349M max:349M
app/web.1: heroku-javaagent: JVM Memory Usage (Non-Heap): used: 37M committed: 37M max:219M
app/web.1: heroku-javaagent: JVM Threads : total: 37 daemon: 7 non-daemon: 21 internal: 9
app/web.1: heroku-javaagent: JVM Memory Usage (Heap): used: 276M committed: 349M max:349M
app/web.1: heroku-javaagent: JVM Memory Usage (Non-Heap): used: 37M committed: 37M max:219M
app/web.1: heroku-javaagent: JVM Threads : total: 37 daemon: 7 non-daemon: 21 internal: 9
app/web.1: heroku-javaagent: JVM Memory Usage (Heap): used: 277M committed: 349M max:349M
app/web.1: heroku-javaagent: JVM Memory Usage (Non-Heap): used: 37M committed: 37M max:219M
app/web.1: heroku-javaagent: JVM Threads : total: 37 daemon: 7 non-daemon: 21 internal: 9
app/web.1: heroku-javaagent: JVM Memory Usage (Heap): used: 277M committed: 349M max:349M
app/web.1: heroku-javaagent: JVM Memory Usage (Non-Heap): used: 37M committed: 37M max:219M
app/web.1: heroku-javaagent: JVM Threads : total: 37 daemon: 7 non-daemon: 21 internal: 9
app/web.1: heroku-javaagent: JVM Memory Usage (Heap): used: 278M committed: 349M max:349M
app/web.1: heroku-javaagent: JVM Memory Usage (Non-Heap): used: 37M committed: 37M max:219M
app/web.1: heroku-javaagent: JVM Threads : total: 37 daemon: 7 non-daemon: 21 internal: 9
heroku/web.1: Process running mem=517M(101.1%)
heroku/web.1: Error R14 (Memory quota exceeded)
heroku/web.1: Process running mem=517M(101.1%)
heroku/web.1: Error R14 (Memory quota exceeded)
heroku/web.1: Process running mem=517M(101.1%)
heroku/web.1: Error R14 (Memory quota exceeded)
app/web.1: heroku-javaagent: JVM Memory Usage (Heap): used: 212M committed: 349M max:349M
app/web.1: heroku-javaagent: JVM Memory Usage (Non-Heap): used: 37M committed: 37M max:219M
app/web.1: heroku-javaagent: JVM Threads : total: 37 daemon: 7 non-daemon: 21 internal: 9
heroku/web.1: Process running mem=517M(101.1%)
heroku/web.1: Error R14 (Memory quota exceeded)
heroku/web.1: Process running mem=517M(101.1%)
heroku/web.1: Error R14 (Memory quota exceeded)
heroku/web.1: Process running mem=517M(101.1%)
heroku/web.1: Error R14 (Memory quota exceeded)
app/web.1: heroku-javaagent: JVM Memory Usage (Heap): used: 213M committed: 349M max:349M
app/web.1: heroku-javaagent: JVM Memory Usage (Non-Heap): used: 37M committed: 37M max:219M
app/web.1: heroku-javaagent: JVM Threads : total: 37 daemon: 7 non-daemon: 21 internal: 9
heroku/web.1: Process running mem=517M(101.1%)
heroku/web.1: Error R14 (Memory quota exceeded)
heroku/web.1: Process running mem=517M(101.1%)
heroku/web.1: Error R14 (Memory quota exceeded)
heroku/web.1: Process running mem=517M(101.1%)
heroku/web.1: Error R14 (Memory quota exceeded)
app/web.1: heroku-javaagent: JVM Memory Usage (Heap): used: 213M committed: 349M max:349M
app/web.1: heroku-javaagent: JVM Memory Usage (Non-Heap): used: 37M committed: 37M max:219M
app/web.1: heroku-javaagent: JVM Threads : total: 37 daemon: 7 non-daemon: 21 internal: 9
heroku/web.1: Process running mem=517M(101.1%)
heroku/web.1: Error R14 (Memory quota exceeded)
heroku/web.1: Process running mem=517M(101.1%)
heroku/web.1: Error R14 (Memory quota exceeded)
heroku/web.1: Process running mem=517M(101.1%)
heroku/web.1: Error R14 (Memory quota exceeded)
app/web.1: heroku-javaagent: JVM Memory Usage (Heap): used: 214M committed: 349M max:349M
app/web.1: heroku-javaagent: JVM Memory Usage (Non-Heap): used: 37M committed: 37M max:219M
app/web.1: heroku-javaagent: JVM Threads : total: 37 daemon: 7 non-daemon: 21 internal: 9
heroku/web.1: Process running mem=517M(101.1%)
heroku/web.1: Error R14 (Memory quota exceeded)
heroku/web.1: Process running mem=517M(101.1%)
heroku/web.1: Error R14 (Memory quota exceeded)
heroku/web.1: Process running mem=517M(101.1%)
heroku/web.1: Error R14 (Memory quota exceeded)
最佳答案
这个问题不应该是 Heroku 特有的,并且应该(理想情况下)能够在本地重现。首先,我建议以与 Heroku 运行应用程序相同的方式在本地运行应用程序:
- 运行
sbt clean compile stage
创建target/start
启动器 - 使用
target/start -Dhttp.port=$PORT $JAVA_OPTS
启动您的应用(将 PORT 设置为您想要的任何内容)
然后我会使用内存分析器,例如 VisualVM ,附加到本地运行的应用程序以查看发生了什么。
如果这不起作用或者您想更好地了解 Heroku 上的内存使用情况,我建议启用 log-runtime-metrics 。这也可以与 Log2Viz 一起使用获得实时内存可视化。
关于scala - 为什么即使在未使用的情况下,我也会在 Heroku 上收到内存配额超出错误? (play2/scala),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15800010/