限制 Java 进程的总内存消耗(在 Cloud Foundry 中)
Limit total memory consumption of Java process (in Cloud Foundry)
关于这两个问题:
- How to set the maximum memory usage for JVM?
- What would cause a java process to greatly exceed the Xmx or Xss limit?
我 运行 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
的更多信息:
- https://github.com/cloudfoundry/java-buildpack/pull/160
- https://www.infobright.com/index.php/malloc_arena_max/#.VmgdprgrJaQ
- https://www.ibm.com/developerworks/community/blogs/kevgrig/entry/linux_glibc_2_10_rhel_6_malloc_may_show_excessive_virtual_memory_usage?lang=en
编辑:一个可能的解释是:http://www.evanjones.ca/java-bytebuffer-leak.html。正如我目前在执行大量传出 HTTP/REST 请求时看到的 OOM 问题,这些缓冲区可能是罪魁祸首。
不幸的是,没有办法明确地对 JVM 实施内存限制。大多数内存区域都是可配置的(-Xmx
、-Xss
、-XX:MaxPermSize
、-XX: MaxMetaspaceSize
等),但您无法控制的是本机内存。本机内存包含从内存映射文件到本机库再到 JNI 代码的一大堆东西。你能做的最好的事情就是分析你的应用程序,找出内存增长发生的地方,然后解决增长问题或者给自己足够的喘息空间来生存。
当然不能令人满意,但最终与无法控制其内存占用的其他语言和运行时没有太大区别。
关于这两个问题:
- How to set the maximum memory usage for JVM?
- What would cause a java process to greatly exceed the Xmx or Xss limit?
我 运行 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
的更多信息:
- https://github.com/cloudfoundry/java-buildpack/pull/160
- https://www.infobright.com/index.php/malloc_arena_max/#.VmgdprgrJaQ
- https://www.ibm.com/developerworks/community/blogs/kevgrig/entry/linux_glibc_2_10_rhel_6_malloc_may_show_excessive_virtual_memory_usage?lang=en
编辑:一个可能的解释是:http://www.evanjones.ca/java-bytebuffer-leak.html。正如我目前在执行大量传出 HTTP/REST 请求时看到的 OOM 问题,这些缓冲区可能是罪魁祸首。
不幸的是,没有办法明确地对 JVM 实施内存限制。大多数内存区域都是可配置的(-Xmx
、-Xss
、-XX:MaxPermSize
、-XX: MaxMetaspaceSize
等),但您无法控制的是本机内存。本机内存包含从内存映射文件到本机库再到 JNI 代码的一大堆东西。你能做的最好的事情就是分析你的应用程序,找出内存增长发生的地方,然后解决增长问题或者给自己足够的喘息空间来生存。
当然不能令人满意,但最终与无法控制其内存占用的其他语言和运行时没有太大区别。