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
默认情况下,Java buildpack 将限制 JVM 的各个内存区域。这样做是为了确保您的 Java 应用程序不会超出容器的内存限制,否则会很糟糕并导致您的应用程序崩溃。
您的应用程序正在尝试创建超出 Java 构建包设置的限制的直接内存量。当我写这篇文章时,Java buildpack 正在设置-XX:MaxDirectMemorySize=10M
。
要实现此功能,您只需在 manifest.yml 中设置一个环境变量,或者使用cf set-env
, 调用JAVA_OPTS
,并且内容需要包含-XX:MaxDirectMemorySize=XXM
您XX
要使用的较大值。
Java buildpack 会看到您何时像这样调整内存设置,并会减少其他内存区域的大小以进行补偿。如果您尝试使用大量直接内存,这可能会导致您没有足够的内存用于其他区域。如果发生这种情况,您将需要增加应用程序的总体内存限制。
https://github.com/cloudfoundry/java-buildpack/blob/master/docs/jre-open_jdk_jre.md#java-options
希望有帮助!