有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Tomcat 8.0.20内存不足错误

在使用Cloud Foundry Java Buildpack将应用程序部署到Cloud Foundry时,当默认Tomcat版本从2.0.18更改为2.0.20时,我在应用程序启动期间开始收到内存不足错误。明确指定8.0.18解决了这个问题。这是在使用Oracle 1.8 JRE

还有人看到这个问题吗?有没有办法解决/调试它

该应用程序确实是在CentOS 6.6(最终版)下运行的独立Tomcat 8.0.20实例中启动的

编辑

看起来应用程序使用Tomcat 8.0.18时达到了内存阈值。最初的内存限制设置为512M。将其增加到640M允许应用程序启动。这让我相信Tomcat 8.0.20比8.0.18需要更多的内存

值得一提的是,这里有一些关于这个问题的更多细节。这是使用离线构建包。Tomcat版本在config/Tomcat中指定。yml。我将版本规格从8+更改为到8.0.18

原创的

tomcat:
  version: 8.+
  repository_root: "{default.repository.root}/tomcat"

修改

tomcat:
  version: 8.0.18
  repository_root: "{default.repository.root}/tomcat"

以下是使用内存限制为512M的8.0.20时的具体错误:

应用程序实例已退出,guid为01832553-beba-49c3-8309-00f496c0b9ca有效负载:{“cc_分区”=>;“默认”、“水滴”=>;“01832553-beba-49c3-8309-00F49C0B9CA”、“版本”=>;“53af085e-9c38-49ff-afb0-C4702224BFF”、“实例”=>;“44343b45b4ca48f19746e567a1ac9a45”、“索引”=>;0、“崩溃原因”=>;“退出状态”=>;“退出描述”=>;“内存不足”、“崩溃时间戳”=>;1427824311}


共 (1) 个答案

  1. # 1 楼答案

    这条消息

    "exit_description"=>"out of memory",

    表示应用程序超出了为其设置的内存限制。CF非常残酷地强制执行内存限制,即使超过最小的内存限制也会导致你的应用程序死机

    Java构建包尽可能地配置JVM,使其不超过您设置的内存限制,但不幸的是,无法保证JVM永远不会超过内存限制。这是因为虽然可以限制堆和元空间的使用,但不能限制线程堆栈和本机内存的使用

    在我写的一篇KB文章here中有更多关于这一点的讨论。本文档主要针对Pivotal的托管CF环境,但通常应适用于任何CF环境

    至于解决方案,最简单的方法就是你提到的,那就是增加内存限制,直到事情稳定下来

    另一种解决方案是覆盖Java构建包内存配置。具体来说,您可以降低线程堆栈大小,这将降低每个线程的内存开销,并可能使您保持在内存限制之下,或者您可以降低堆和/或元空间大小(或百分比),这将为其他事情留下更多内存,并希望再次将您保持在内存限制之下

    作为旁注,调整Java构建包所设置的内存配置通常要求您分叉构建包,但是在最近的commit中,这已经改变了。如果使用的是最新版本的构建包,则可以使用说明here更改内存配置

    有关Java构建包如何配置JVM的更多信息,请参见here