将 Spring Boot 应用程序部署到 Cloud Foundry 因 JVM 内存问题而失败

1 jvm terracotta heap-memory cloud-foundry

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

 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
Run Code Online (Sandbox Code Playgroud)

编辑: 通过删除堆外 ehcache 配置来修复:maxBytesLocalOffHeap

Dan*_*usa 5

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

您的应用程序正在尝试创建超出 Java 构建包设置的限制的直接内存量。当我写这篇文章时,Java buildpack 正在设置-XX:MaxDirectMemorySize=10M

要实现此功能,您只需在 manifest.yml 中设置一个环境变量,或者使用cf set-env, 调用JAVA_OPTS,并且内容需要包含-XX:MaxDirectMemorySize=XXMXX要使用的较大值。

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

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

希望有帮助!