限制 Java 进程的总内存消耗(在 Cloud Foundry 中)

Limit total memory consumption of Java process (in Cloud Foundry)

关于这两个问题:

我 运行 Cloud Foundry 上的一个 Java 应用程序,需要确保未超出分配的内存。否则,这是当前的问题,进程被 Cloud Foundry 监控机制 (Linux CGROUP) 杀死。

Java Buildpack 会自动为 -Xmx-Xss 设置合理的值。通过调整参数和配置预期线程的(最大)数量,我很确定 Java 进程消耗的内存应该小于我分配给我的 Cloud Foundry 应用程序的上限。

但是,我仍然遇到 Cloud Foundry "out of memory" 错误(NOT Java OOM 错误!): index: 3, reason: CRASHED, exit_description: out of memory, exit_status: 255

我尝试了 MALLOC_ARENA_MAX 设置。将该值设置为 1 或 2 会导致启动缓慢。使用 MALLOC_ARENA_MAX=4 我仍然看到如上所述的错误,所以这不是我的问题的解决方案。

目前我使用非常紧凑的内存设置进行测试,这样问题更容易重现。但是,即使这样,我也必须等待大约 20-25 分钟才能发生错误。

我必须指定哪些参数 and/or 环境变量以确保我的 Java 进程 永远不会 超过特定的内存限制?如果应用程序确实需要更多内存,则因 Java OOM 错误而崩溃是可以接受的。

有关 MALLOC_ARENA_MAX 的更多信息:

编辑:一个可能的解释是:http://www.evanjones.ca/java-bytebuffer-leak.html。正如我目前在执行大量传出 HTTP/REST 请求时看到的 OOM 问题,这些缓冲区可能是罪魁祸首。

不幸的是,没有办法明确地对 JVM 实施内存限制。大多数内存区域都是可配置的(-Xmx-Xss-XX:MaxPermSize-XX: MaxMetaspaceSize 等),但您无法控制的是本机内存。本机内存包含从内存映射文件到本机库再到 JNI 代码的一大堆东西。你能做的最好的事情就是分析你的应用程序,找出内存增长发生的地方,然后解决增长问题或者给自己足够的喘息空间来生存。

当然不能令人满意,但最终与无法控制其内存占用的其他语言和运行时没有太大区别。