gpt4 book ai didi

java - swisscom cloud foundry spring boot app内存不足

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:04:41 25 4
gpt4 key购买 nike

我有一个 SpringBoot 应用程序,它只需要 max. 284 MB 内存。但我只能以最大启动应用程序。 768 MB 内存。即使我以后减少内存,我总是会收到以下错误:

[APP/PROC/WEB/0] ERR Cannot calculate JVM memory configuration: There is insufficient memory remaining for heap. Memory limit 384M is
less than allocated memory 672509K (-XX:ReservedCodeCacheSize=240M, -XX:MaxDirectMemorySize=10M, -XX:MaxMetaspaceSize=109309K, -Xss1M * 300 threads)

我已经在 cf 中使用相同的应用程序而没有这个问题。 cf有什么变化?在 2 或 3 周之前它仍然有效。

预先感谢您的快速回答!

最佳答案

I am already using the same app in cf without this problem. What has changed in cf? Before 2 or 3 weeks it still worked.

您必须已升级到 Java Build Pack v4。使用 JBP v3,您可以推送具有较小内存量的应用程序,但使用该版本的构建包和小内存限制推送的应用程序也很容易崩溃。这样做的原因是因为 JBP v3 在 JBP 进行计算时没有考虑 JVM 使用的所有内存区域,因此虽然它会让您的应用程序启动,但应用程序稍后仍可能超过其内存限制。 JBP v4 计算内存的方式现在更加准确,并将 JVM 的所有内存区域都考虑在内。

最终结果是,使用小于 1G RAM 运行的 JBP v4 应用程序可以在暂存时看到以下错误,而以 512M 或更少内存运行的应用程序几乎肯定会在暂存时看到此错误:

ERR Cannot calculate JVM memory configuration: There is insufficient memory remaining for XXXX

但是,成功过渡的 Java 应用崩溃的可能性要小得多。

https://discuss.pivotal.io/hc/en-us/articles/115011717548-Insufficient-memory-when-using-Java-Buildpack-4-0-

那么这是否意味着您不能在 RAM 小于 1G 的情况下运行 Java 应用程序?不可以,但需要进行一些调整。以下是您可以调整以节省一些内存的一些事项的列表。

  • 线程数。 JBP 假定您的应用程序将使用 250 个线程运行。这对于 Web 应用程序来说很常见,大约有 50 个用于 Tomcat 的内部内容,200 个用于请求处理。您可以降低此值,但您需要确保您的应用程序不会超过您设置的任何线程数,否则您的应用程序可能会崩溃。对于您来说,这将通过 Spring Boot 调整 Tomcat 的配置。

    JBP 的较低线程数示例:

    cf set-env my-application JBP_CONFIG_OPEN_JDK_JRE '{ memory_calculator: { stack_threads: 50 } }'

    Spring Boot application.properties 中线程数较低的示例:

    server.tomcat.max-threads=25

    注意:这只是请求处理线程。 Tomcat 本身有线程,您的应用程序也可以创建线程。您真的应该查看线程转储或 JVisualVM 以查看您的应用程序需要多少线程(即测量,不要猜测)

  • 线程堆栈大小 (-Xss)。这是一个传递给 JVM 的值,它控制每个线程需要多少内存。它默认为 1M,这是非常高的。在大多数情况下,您可以安全地将它降低到 160K,这是 Java 8 允许的最小值。如果您有 250 个线程并进行此更改,您将节省 (1M * 250) - (160K - 250) = 211M RAM .

    注意:如果您将线程堆栈大小降低得太多,您将在您的应用中看到 StackOverflow 异常。如果发生这种情况,请保持冷静并提高值(value),直到它们消失。

  • 降低保留代码缓存。这是 JVM 缓存 JIT 代码的地方。它默认为 24​​0M。您可以降低此值,但要小心,因为这绝对会影响性能。您还可以查看 errors at runtime if this value is not high enough .

    同样,最好衡量您的应用需要什么而不是猜测。您应该能够使用 JVM's NMT 进行测量.

  • 您可以手动调整 JVM 使用的其他内存区域,例如堆和元空间。使用 JBP v4,只需使用 cf set-env 或在 manifest.yml 文件中设置 JAVA_OPTS 环境变量即可。显然,如果您降低这些值,您需要小心,不要太低,在这种情况下,您最终会遇到 OutOfMemoryErrors。

    注意:如果您未设置一个区域,例如堆或元空间,JBP 将使用您手动自定义后剩余的任何内容巧妙地计算它。

希望对您有所帮助!

关于java - swisscom cloud foundry spring boot app内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47830849/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com