Java/Spring 应用程序无法在 cloudfoundry 上启动:OutOfMemoryError Compressed class space
Java/Spring application cannot start up on cloudfoundry: OutOfMemoryError Compressed class space
在 CloudFoundry 上 运行 将我们的 Java/Spring 启动软件的新版本部署到 Swisscom Developer Cloud 后,启动突然失败并出现以下错误:OutOfMemoryError: Compressed class space
。因此,我们决定部署该软件的先前版本,实际上是 运行 之前的版本:同样的错误发生了。我们没有从 Java7 切换到 Java8,也没有更改任何配置。这就引出了一个问题:这真的是我们这边的错误还是服务器端的错误?
然后我们尝试通过将变量 JBP_CONFIG_OPEN_JDK_JRE
设置为以下行之一来增加 MaxMetaspaceSize
:
[jre: {version: 1.8.0_+}, memory_calculator: {memory_sizes: {metaspace: 128m}}]
{memory_calculator: {memory_sizes: {metaspace: 128m}}}
{memory_sizes: {metaspace: 128m}}
应用程序总是警告,memory_sizes
的值无效。这个 YAML 变量的正确格式是什么?
[ConfigurationUtils] WARN User config value for 'memory_sizes' is not valid, existing property not present
然后我们在 Swisscom Developer Console 上删除了 Java 应用程序和数据库服务并重新创建了它。没有效果,出现同样的错误
最后,您知道为什么这个错误会突然发生吗,即使是几分钟前 运行 还不错的版本?
编辑:
这是清单([database-service-name]
和 [application-name]
已被替换):
---
path: .
instances: 1
buildpack: https://github.com/cloudfoundry/java-buildpack
services:
- [database-service-name]
applications:
- name: [application-name]
domain: scapp.io
host: [application-name]
memory: 1024M
disk_quota: 1024M
env:
SPRING_PROFILES_ACTIVE: stage, cloudfoundry
Java buildpack 版本是(根据日志):
2017-03-03 11:47:02 [STG/0] OUT -----> Java Buildpack Version: b08a692 | https://github.com/cloudfoundry/java-buildpack#b08a692
这条命令似乎被执行了(在崩溃后的日志中):
2017-03-03 11:46:25 [APP/PROC/WEB/0] OUT vcap 8 0 99 10:46 ? 00:01:09 /home/vcap/app/.java-buildpack/open_jdk_jre/bin/java -Djava.io.tmpdir=/home/vcap/tmp -XX:OnOutOfMemoryError=/home/vcap/app/.java-buildpack/open_jdk_jre/bin/killjava.sh -XX:MaxDirectMemorySize=10M -XX:MaxMetaspaceSize=68540K -XX:ReservedCodeCacheSize=240M -XX:CompressedClassSpaceSize=8731K -Xmx408104K -Djavax.net.ssl.trustStore=/home/vcap/app/.java-buildpack/container_certificate_trust_store/truststore.jks -Djavax.net.ssl.trustStorePassword=java-buildpack-trust-store-password -cp /home/vcap/app/. org.springframework.boot.loader.WarLauncher
发生 OutOfMemory 错误是因为 Java buildpack 已更改为使用内存计算器版本 3.x。 GitHub issue 390 中正在讨论此更改引起的类似问题。详情请参考本期
通常,内存计算器的 v3.x 根据应用程序中 class 文件的数量和一些默认值选择各种 JVM 内存设置的值,这些默认值取决于 Java。然后它将最大堆大小设置为剩余内存量。
之前版本的内存计算器是通过设置JBP_CONFIG_OPEN_JDK_JRE
配置的。然而,v3.x可以简单地通过在JAVA_OPTS
中设置相应的Java内存设置来配置。例如,您可以将最大元空间大小设置为 100 Mb,如下所示:
cf set-env app-name JAVA_OPTS '-XX:MaxMetaspaceSize=100m'
如果您只是想要解决方法,可以使用内存计算器更改之前发布的 Java buildpack 版本:
cf push -b https://github.com/cloudfoundry/java-buildpack.git\#v3.14 ...
来自 Swisscom Java 开发者的评论:
For sure they will be reverting the memory heuristics to what they
were in 3.13 or at least refine the calculations. The current
recommendation to all customers is either
- 使用 3.13 或
- 对环境变量
JAVA_OPTS
使用一些显式选项。
在 CloudFoundry 上 运行 将我们的 Java/Spring 启动软件的新版本部署到 Swisscom Developer Cloud 后,启动突然失败并出现以下错误:OutOfMemoryError: Compressed class space
。因此,我们决定部署该软件的先前版本,实际上是 运行 之前的版本:同样的错误发生了。我们没有从 Java7 切换到 Java8,也没有更改任何配置。这就引出了一个问题:这真的是我们这边的错误还是服务器端的错误?
然后我们尝试通过将变量 JBP_CONFIG_OPEN_JDK_JRE
设置为以下行之一来增加 MaxMetaspaceSize
:
[jre: {version: 1.8.0_+}, memory_calculator: {memory_sizes: {metaspace: 128m}}]
{memory_calculator: {memory_sizes: {metaspace: 128m}}}
{memory_sizes: {metaspace: 128m}}
应用程序总是警告,memory_sizes
的值无效。这个 YAML 变量的正确格式是什么?
[ConfigurationUtils] WARN User config value for 'memory_sizes' is not valid, existing property not present
然后我们在 Swisscom Developer Console 上删除了 Java 应用程序和数据库服务并重新创建了它。没有效果,出现同样的错误
最后,您知道为什么这个错误会突然发生吗,即使是几分钟前 运行 还不错的版本?
编辑:
这是清单([database-service-name]
和 [application-name]
已被替换):
---
path: .
instances: 1
buildpack: https://github.com/cloudfoundry/java-buildpack
services:
- [database-service-name]
applications:
- name: [application-name]
domain: scapp.io
host: [application-name]
memory: 1024M
disk_quota: 1024M
env:
SPRING_PROFILES_ACTIVE: stage, cloudfoundry
Java buildpack 版本是(根据日志):
2017-03-03 11:47:02 [STG/0] OUT -----> Java Buildpack Version: b08a692 | https://github.com/cloudfoundry/java-buildpack#b08a692
这条命令似乎被执行了(在崩溃后的日志中):
2017-03-03 11:46:25 [APP/PROC/WEB/0] OUT vcap 8 0 99 10:46 ? 00:01:09 /home/vcap/app/.java-buildpack/open_jdk_jre/bin/java -Djava.io.tmpdir=/home/vcap/tmp -XX:OnOutOfMemoryError=/home/vcap/app/.java-buildpack/open_jdk_jre/bin/killjava.sh -XX:MaxDirectMemorySize=10M -XX:MaxMetaspaceSize=68540K -XX:ReservedCodeCacheSize=240M -XX:CompressedClassSpaceSize=8731K -Xmx408104K -Djavax.net.ssl.trustStore=/home/vcap/app/.java-buildpack/container_certificate_trust_store/truststore.jks -Djavax.net.ssl.trustStorePassword=java-buildpack-trust-store-password -cp /home/vcap/app/. org.springframework.boot.loader.WarLauncher
发生 OutOfMemory 错误是因为 Java buildpack 已更改为使用内存计算器版本 3.x。 GitHub issue 390 中正在讨论此更改引起的类似问题。详情请参考本期
通常,内存计算器的 v3.x 根据应用程序中 class 文件的数量和一些默认值选择各种 JVM 内存设置的值,这些默认值取决于 Java。然后它将最大堆大小设置为剩余内存量。
之前版本的内存计算器是通过设置JBP_CONFIG_OPEN_JDK_JRE
配置的。然而,v3.x可以简单地通过在JAVA_OPTS
中设置相应的Java内存设置来配置。例如,您可以将最大元空间大小设置为 100 Mb,如下所示:
cf set-env app-name JAVA_OPTS '-XX:MaxMetaspaceSize=100m'
如果您只是想要解决方法,可以使用内存计算器更改之前发布的 Java buildpack 版本:
cf push -b https://github.com/cloudfoundry/java-buildpack.git\#v3.14 ...
来自 Swisscom Java 开发者的评论:
For sure they will be reverting the memory heuristics to what they were in 3.13 or at least refine the calculations. The current recommendation to all customers is either
- 使用 3.13 或
- 对环境变量
JAVA_OPTS
使用一些显式选项。