尽管设置了 -Xmx300m -Xss512k -XX :MetaspaceSize=100M?,Java 内存仍超过 512mb

标签 java heroku jvm

我已经使用以下虚拟机选项将 java 应用程序部署到 Heroku:

-Xmx300m -Xss512k -XX:MetaspaceSize=100M

尽管如此,我的应用程序始终从 Heroku 收到错误 R14(内存配额超出) 错误。这是因为内存占用达到540+mb(配额为512mb)。

当我在 VM 参数中只为其分配 400mb 时,java 应用程序如何占用超过 500mb 的空间?我是否缺少虚拟机参数?

我预计 JVM 在达到 512mb 内存之前会出现 OOM(但它只是增加到超出我设置的限制)。

也许我完全误解了这些虚拟机参数的工作原理?

对此的任何帮助将不胜感激。

注释:

  • 我正在使用 java 8
  • 我的 procfile 如下:

    web: java -Xmx300m -Xss512k -XX:MetaspaceSize=100M -javaagent:./lib/heroku-javaagent-2.0.jar=stdout=true,lxmem=true -Dserver.port=$PORT -Dspring.profiles.active=heroku -cp ./app.jar          org.springframework.boot.loader.JarLauncher
    

上面的 java 代理在日志中输出以下详细信息:

Dec 13 11:45:54 app/web.1:  measure.mem.jvm.heap.used=177M measure.mem.jvm.heap.committed=212M measure.mem.jvm.heap.max=273M 
Dec 13 11:45:54 app/web.1:  measure.mem.jvm.nonheap.used=129M measure.mem.jvm.nonheap.committed=132M measure.mem.jvm.nonheap.max=0M 
Dec 13 11:45:54 app/web.1:  measure.mem.jvm.direct.used=0M measure.mem.jvm.direct.count=0 measure.mem.jvm.direct.capacity=74M 
Dec 13 11:45:54 app/web.1:  measure.mem.jvm.mapped.used=0M measure.mem.jvm.mapped.count=0 measure.mem.jvm.mapped.capacity=0M 
Dec 13 11:45:54 app/web.1:  measure.mem.linux.vsz=5817M measure.mem.linux.rss=543M 

最佳答案

How can a java application take up over 500mb, when I'm only allocating 400mb to it in the VM args? Am I missing a VM arg?

JVM 有许多类别的内存,包括堆、元空间、线程堆栈、代码缓存等。甚至可能存在 JVM 无法解释的通过 JNI 分配的内存。看看this blog post on JVM memory .

I would expect the JVM to OOM before reaching 512mb of memory (but it just increases beyond the limits I have set it).

大多数 OOM 错误仅在堆空间不足时发生。就您而言,您有足够的堆空间,但所有其他类别加起来并超过了 512mb 限制。

您可以尝试将 Xmx 降低为 -Xmx256m。低于该值,您可能会开始出现 OOM 错误。

您可能还想检查代码是否存在泄漏 IO 缓冲区。如果未正确关闭,它们有时会导致 native 内存(堆外)泄漏。最后,检查您的任何依赖项(第三方库)是否正在使用 JNI 或分配 native 内存。

关于尽管设置了 -Xmx300m -Xss512k -XX :MetaspaceSize=100M?,Java 内存仍超过 512mb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47791341/

相关文章:

java - 如何在 Travis CI 中设置 "api_key"值

python - 在Heroku上的python worker进程中使用try语句来处理由于对等错误而导致的连接重置是否理想?

java - 如何创建自定义 JVM 启动器?

JAVA:循环内定义的引用

java - 当有互联网连接时,JVM 已用堆会增长

java - 如何随机化字符串中字母的大小写

Java 自定义类 w/Defaultlistmodel 添加的元素未保存

css - heroku css 样式表不会显示

java - 在这种情况下我可以避免嵌套 for 循环吗?

java - 在 jboss-as-7.1.1.Final 中添加数据源