java - Tomcat 8.0.20 内存不足错误

标签 java tomcat cloud-foundry

使用 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 稍微多一点的内存。

对于它的值(value),这里有一些关于这个问题的更多细节。这是使用离线构建包。 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_partition"=>"default", "droplet"=>"01832553-beba-49c3-8309-00f496c0b9ca", "version"= >"53af085e-9c38-49ff-afb0-c4702224b5ff", "instance"=>"44343b45b4ca48f19746e567a1ac9a45", "index"=>0, "reason"=>"CRASHED", "exit_status"=>255, "exit_description"=> “内存不足”,“crash_timestamp”=>1427824311}

最佳答案

这条消息...

"exit_description"=>"out of memory",

表示您的应用程序超出了您为其设置的内存限制。 CF 非常残酷地执行内存限制,即使超过它,即使是最小的数量也会导致您的应用程序被杀死。

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

我写的一篇知识库文章对此有更多讨论 here .该文档主要针对 Pivotal 的托管 CF 环境,但通常应适用于任何 CF 环境。

就解决方案而言,最简单的就是您提到的,就是增加内存限制,直到情况稳定。

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

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

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

关于java - Tomcat 8.0.20 内存不足错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29169010/

相关文章:

java - 潜在无用的对象

java - 无法在 Cloud Foundry 上部署 helloworld spring-boot 应用程序

java - Cloud Foundry - log4j2 - 将应用程序 URI 合并到日志中

eclipse - 使用 Eclipse 开发 CloudFoundry 应用程序时,允许哪些项目类型?

java - 使用 java 流将包含标题和行的 csv 文件转换为 hashmap 数组

java - groovy 中的类加载问题

java - Class.getResourceAsStream 的说明以及如何在 Tomcat 中为简单的 Java Web 应用程序设置它?

java - 如何优雅地关闭 docker 容器中 tomcat 中的 servelts?

Eclipse Tomcat 资源可用列表不包含 Gwt 2.7.0 maven 应用程序

java - 从远程位置动态加载 jar