限制Java进程的总内存消耗(在Cloud Foundry中)
关于这两个问题:限制Java进程的总内存消耗(在Cloud Foundry中),java,memory,jvm,out-of-memory,cloud-foundry,Java,Memory,Jvm,Out Of Memory,Cloud Foundry,关于这两个问题: 我在CloudFoundry上运行了一个Java应用程序,需要确保没有超出分配的内存。否则,这就是当前的问题,该进程将被CloudFoundry监视机制(LinuxCGroup)终止 Java Buildpack会自动为-Xmx和-Xss设置sane值。通过调整参数和配置预期线程的(最大)数量,我非常确定Java进程消耗的内存应该小于我分配给Cloud Foundry应用程序的上限 但是,我仍然遇到CloudFoundry“内存不足”错误(不是Java OOM错误!):
-Xmx
和-Xss
设置sane值。通过调整参数和配置预期线程的(最大)数量,我非常确定Java进程消耗的内存应该小于我分配给Cloud Foundry应用程序的上限
但是,我仍然遇到CloudFoundry“内存不足”错误(不是Java OOM错误!):
索引:3,原因:崩溃,退出描述:内存不足,退出状态:255
我尝试了MALLOC\u ARENA\u MAX
设置。将该值设置为1或2会导致启动缓慢。使用MALLOC\u ARENA\u MAX=4
时,我仍然看到如上所述的错误,因此这并不能解决我的问题
目前,我使用非常紧凑的内存设置进行测试,以便更容易重现问题。但是,即使这样,我也必须等待大约20-25分钟才能发生错误
我必须指定哪些参数和/或环境变量,以确保我的Java进程永远不会超过某个内存限制?如果应用程序实际需要更多内存,那么使用Java OOM错误崩溃是可以接受的
有关MALLOC_ARENA_MAX的更多信息:
编辑:可能的解释如下:。正如我目前在执行大量传出HTTP/REST请求时看到的OOM问题,可能是这些缓冲区造成的。不幸的是,没有办法在JVM上强制执行内存限制。大多数内存区域都是可配置的(
-Xmx
,-Xss
,-XX:MaxPermSize
,-XX:MaxMetaspaceSize
,等等),但您无法控制的是本机内存。本机内存包含从内存映射文件到本机库再到JNI代码的所有内容。您所能做的最好的事情就是分析您的应用程序,找出内存增长的地方,要么解决内存增长问题,要么给自己足够的喘息空间来生存
当然不令人满意,但最终与其他对内存占用没有控制的语言和运行时没有太大区别。有多紧?我们已经看到JVM
native
内存消耗在启动时不断膨胀(对于发生的事情,这是非常不透明的),但随着启动的进行,最终会将所有本机内存返回给操作系统。你可能会遇到这种情况。虽然在不到10兆字节的可用空间内,但我想我还是设法使它不到1兆字节。那乘气球需要多长时间?秒?分钟?秒,但通常足够长,足以触发容器的防御。如果您看到容器在之后介入,那么很可能您看到的是native
memory growth.OK。非常感谢。我的服务在大约20分钟后崩溃。“使用-Djdk.nio.maxCachedBufferSize=262144运行服务以避免此问题。”Evan Jones的博客文章中解释了这一点,这是一个有用的提示。该功能已后端口至8u102,请参阅