Tomcat 8.0.20 内存不足错误
Tomcat 8.0.20 Out of Memory Error
在使用 Cloud Foundry Java Buildpack 将应用程序部署到 Cloud Foundry 时,当默认 Tomcat 版本从 2.0.18 更改为 2.0.20 时,我开始在应用程序启动期间收到内存不足错误。明确指定 8.0.18 解决了这个问题。这是使用 Oracle 1.8 JRE。
还有其他人看到这个问题吗?有什么想法如何 address/debug 吗?
该应用程序确实在 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_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"=>"out of memory", "crash_timestamp"=>1427824311}
这条消息...
"exit_description"=>"out of memory",
表示您的应用程序超出了您为其设置的内存限制。 CF 非常残酷地执行内存限制,即使超过它,即使是最小的数量也会导致您的应用程序被杀死。
Java 构建包最好配置 JVM,使其不超过您设置的内存限制,但不幸的是,无法保证 JVM 永远不会超过内存限制。这是因为虽然您可以限制堆和元空间的使用,但您不能限制线程堆栈和本机内存的使用。
我写的知识库文章 here 对此有更多讨论。该文档主要针对 Pivotal 的托管 CF 环境,但通常应适用于任何 CF 环境。
就解决方案而言,最简单的就是你提到的,就是增加内存限制,直到情况稳定。
另一种解决方案是覆盖 Java 构建包内存配置。具体来说,您可以降低线程堆栈大小,这将降低每个线程的内存开销并可能使您保持在内存限制之下,或者您可以降低堆和/或元空间大小(或百分比),这将为其他线程留出更多内存事情再一次希望让你在内存限制下。
作为旁注,调整由 Java 构建包设置的内存配置过去需要您分叉构建包,但是在最近 commit this has changed. If you're using a recent version of the build pack, you can use the instructions here 中更改内存配置。
有关 Java 构建包如何配置 JVM 的更多信息,请参见 here。
在使用 Cloud Foundry Java Buildpack 将应用程序部署到 Cloud Foundry 时,当默认 Tomcat 版本从 2.0.18 更改为 2.0.20 时,我开始在应用程序启动期间收到内存不足错误。明确指定 8.0.18 解决了这个问题。这是使用 Oracle 1.8 JRE。
还有其他人看到这个问题吗?有什么想法如何 address/debug 吗?
该应用程序确实在 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_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"=>"out of memory", "crash_timestamp"=>1427824311}
这条消息...
"exit_description"=>"out of memory",
表示您的应用程序超出了您为其设置的内存限制。 CF 非常残酷地执行内存限制,即使超过它,即使是最小的数量也会导致您的应用程序被杀死。
Java 构建包最好配置 JVM,使其不超过您设置的内存限制,但不幸的是,无法保证 JVM 永远不会超过内存限制。这是因为虽然您可以限制堆和元空间的使用,但您不能限制线程堆栈和本机内存的使用。
我写的知识库文章 here 对此有更多讨论。该文档主要针对 Pivotal 的托管 CF 环境,但通常应适用于任何 CF 环境。
就解决方案而言,最简单的就是你提到的,就是增加内存限制,直到情况稳定。
另一种解决方案是覆盖 Java 构建包内存配置。具体来说,您可以降低线程堆栈大小,这将降低每个线程的内存开销并可能使您保持在内存限制之下,或者您可以降低堆和/或元空间大小(或百分比),这将为其他线程留出更多内存事情再一次希望让你在内存限制下。
作为旁注,调整由 Java 构建包设置的内存配置过去需要您分叉构建包,但是在最近 commit this has changed. If you're using a recent version of the build pack, you can use the instructions here 中更改内存配置。
有关 Java 构建包如何配置 JVM 的更多信息,请参见 here。