当前位置: 首页 > 知识库问答 >
问题:

限制Java进程的总内存消耗(在云铸造中)

阴宏爽
2023-03-14

与这两个问题相关的是:

    null

Java Buildpack自动为-xmx-xss设置sane值。通过调优参数和配置预期线程的(最大)数量,我非常确定Java进程消耗的内存应该小于我分配给云铸造应用程序的上限。

但是,我仍然会遇到Cloud Foundry“内存不足”错误(不是Java OOM错误!):索引:3,原因:崩溃,exit_description:内存不足,exit_status:255

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

我必须指定哪些参数和/或环境变量来确保我的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

共有1个答案

宗政卓
2023-03-14

不幸的是,没有办法明确地对JVM实施内存限制。大多数内存区域都是可配置的(-xmx-xss-xx:maxpermsize-xx:maxmetaspacesize等),但不能控制的是本机内存。本机内存包含大量内容,从内存映射文件到本机库再到JNI代码。您所能做的最好的就是分析您的应用程序,找出内存增长的原因,或者解决增长问题,或者给自己足够的喘息空间来生存。

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

 类似资料:
  • 关于Java应用程序使用的驻留内存,我有两个问题。 一些背景细节: 我用-xms2560m-xmx2560m设置了一个java应用程序。 java应用程序在容器中运行。k8s允许容器最多消耗4GB. 堆:应用程序的工作方式似乎是使用所有内存,然后释放,然后使用等等。 这张快照说明了这一点。Y列是空闲堆内存。(由应用程序通过)提取) 我还可以使用HotSpotDiagnosticMXBean来确认它

  • 问题内容: 为了限制Java 7应用程序消耗的总内存,我可以使用以下公式(摘自本文): 最大内存= [-Xmx] + [-XX:MaxPermSize] +线程数* [-Xss] 删除PermGen之后,此公式对于Java 8应用程序将如何更改? 我应该使用选项“ -XX:MaxMetaspaceSize”来限制元空间消耗的最大内存吗? 问题答案: 是的,这里有代替。 还考虑限制直接ByteBuf

  • 我有一个很小的java控制台应用程序,我想在内存使用方面进行优化。它是在Xmx设置为仅64MB的情况下运行的。根据不同的监视工具(htop、ps、pmap、Dynatrace)显示进程的总体内存使用量超过250MB。我主要在Ubuntu18上运行它(也在其他操作系统上测试)。 我使用了-xx:nativeMemoryTracking,java param和jcmd的本地内存跟踪,以找出为什么在堆之

  • 是否可以限制会话和与之相关的请求可以使用的内存量? 例如,我希望将每个用户会话限制为一兆字节。此限制应适用于处理请求时创建的任何对象。有可能吗?

  • 我正在docker中运行一个java进程。我已经设置了xms(388m)和xmx(388m)。在应用程序启动后的某个时候,容器的内存消耗超过并达到了大部分~主机内存大小,容器被杀死。 < li >当我使用jprofiler连接到java进程时,我看到堆小于Xmx < li >但是,容器内顶部的命令显示< code>docker stats显示的内容 < li >当我在主机上运行相同的java进程时