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

与这两个问题相关:

  • 如何设置JVM的最大内存使用量?
  • 什么会导致java进程大大超过Xmx或Xss限制?

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

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

但是,我仍然遇到Cloud Foundry“内存不足”错误( 不是 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分钟才能发生错误。

我必须指定哪些参数和/或环境变量,以确保我的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等),但您无法控制的是Native内存。 本机内存包含从内存映射文件到本机库到JNI代码的大量内容。 您可以做的最好的事情是分析您的应用程序,找出内存增长的位置,并解决增长或给自己足够的喘息空间来生存。

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

Interesting Posts