在使用Cloud Foundry Java Buildpack将应用程序部署到Cloud Foundry时,当应用程序启动时,当默认Tomcat版本从2.0.18更改为2.0.20时,我开始收到Out Of Memory错误。明确指定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。
对于它的价值,这里有一些关于这个问题的更多细节。这是使用脱机buildpack。 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-00f496c0b9c payload:{" cc_partition" =>"默认"," droplet" => ;" 01832553-beba-49c3-8309-00f496c0b9ca","版本" =>" 53af085e-9c38-49ff-afb0-c4702224b5ff","实例" =>" 44343b45b4ca48f19746e567a1ac9a45","索引" => 0,"原因" =>" CRASHED",& #34; exit_status" => 255," exit_description" =>"内存不足"," crash_timestamp" => 1427824311}
答案 0 :(得分:2)
此消息......
" exit_description" =>"内存不足",
表示您的应用程序超出了为其设置的内存限制。 CF是非常残酷的执行内存限制,超过它甚至是最小的数量将导致您的应用程序被杀死。
Java构建包最好配置JVM,使其不超过您放置的内存限制,但遗憾的是无法保证JVM永远不会超过内存限制。这是因为虽然您可以限制堆和元空间的使用,但您无法限制线程堆栈和本机内存使用等内容。
我在撰写here的知识库文章中对此进行了更多讨论。该文档专注于Pivotal的托管CF环境,但通常应适用于任何CF环境。
就解决方案而言,最简单的就是你提到的,就是在事情稳定之前增加内存限制。
另一种解决方案是覆盖Java构建包内存配置。具体来说,您可以降低线程堆栈大小,这将降低每个线程的内存开销,并可能使您保持在内存限制之下,或者您可以降低堆和/或元空间大小(或百分比),这将为其他线程留下更多内存事情再次希望让你处于记忆极限之下。
作为旁注,调整由Java构建包设置的内存配置用于要求您分叉构建包,但是在最近的commit中,这已经发生了变化。如果您使用的是最新版本的构建包,则可以使用说明here更改内存配置。
可以找到有关Java构建包如何配置JVM的更多信息here。