将Spring Boot应用程序部署到Cloud Foundry失败并出现JVM内存问题

时间:2019-05-08 09:00:27

标签: jvm heap cloudfoundry terracotta

将Spring Boot应用程序部署到Pivotal Cloud Foundry失败,并出现以下错误。实例的限制设置为2GB,然后设置为4GB。在本地,应用程序启动时堆大小为2GB。 缓存管理器初始化期间应用程序失败。 任何想法可能是根本原因吗?不知道兵马俑在云铸造中扮演什么角色,还需要寻找什么?

 2019-05-07T19:24:53.39+0530 [APP/PROC/WEB/0] OUT     at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)
   2019-05-07T19:24:53.39+0530 [APP/PROC/WEB/0] OUT Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.cache.CacheManager]: Factory method 'cacheManager' threw exception; nested exception is org.ehcache.StateTransitionException: Cache '<name hidden>' creation in EhcacheManager failed.
....
 Caused by: java.lang.IllegalArgumentException: An attempt was made to allocate more off-heap memory than the JVM can allow. The limit on off-heap memory size is given by the -XX:MaxDirectMemorySize command (or equivalent).
   2019-05-07T19:15:13.15+0530 [APP/PROC/WEB/0] OUT     at org.terracotta.offheapstore.paging.UpfrontAllocatingPageSource.bufferAllocation(UpfrontAllocatingPageSource.java:564)
   2019-05-07T19:15:13.15+0530 [APP/PROC/WEB/0] OUT     at org.terracotta.offheapstore.paging.UpfrontAllocatingPageSource.lambda$allocateBackingBuffers$1(UpfrontAllocatingPageSource.java:513)
   2019-05-07T19:15:13.15+0530 [APP/PROC/WEB/0] OUT     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
   2019-05-07T19:15:13.15+0530 [APP/PROC/WEB/0] OUT     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
   2019-05-07T19:15:13.15+0530 [APP/PROC/WEB/0] OUT     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
   2019

编辑: 已修复,方法是删除堆外ehcache配置:maxBytesLocalOffHeap

1 个答案:

答案 0 :(得分:1)

默认情况下,Java buildpack将约束JVM的各种内存区域。这样做是为了确保您的Java应用程序不会超出容器的内存限制,这将是很糟糕的事情,并可能导致您的应用程序崩溃。

您的应用尝试创建的直接内存量超出了Java buildpack设置的限制。在我撰写本文时,Java buildpack正在设置-XX:MaxDirectMemorySize=10M

要执行此操作,您只需要在manifest.yml或使用cf set-env的{​​{1}}中设置一个环境变量,其内容需要包含JAVA_OPTS,其中{ {1}}是您要使用的较大值。

当您像这样调整内存设置时,Java buildpack将出现,并且将减小其他内存区域的大小以进行补偿。如果您尝试使用大量的直接内存,这可能会导致您没有足够的内存用于其他区域。如果发生这种情况,则需要增加应用程序的整体内存限制。

https://github.com/cloudfoundry/java-buildpack/blob/master/docs/jre-open_jdk_jre.md#java-options

希望有帮助!