Cloud foundry CloudFoundry容器内存增加,最终崩溃

Cloud foundry CloudFoundry容器内存增加,最终崩溃,cloud-foundry,Cloud Foundry,我们部署了我们的应用程序(Spring Boot App),并在PCF中运行了几天,请求得到处理,容器内存逐渐增加,达到80%或90%,但根本没有减少。应用程序一度崩溃 CPU行为似乎很好,当有负载时,它会再次出现尖峰和下降。它在本地机器中运行良好。我猜GC在PCF容器中没有正常发生 有没有人面对过这个问题,有没有人能帮助我们 它在本地机器上运行良好 这几乎可以肯定是苹果对橙子的比较(即,不是有效的比较)。很可能在您的本地环境和运行在CloudFoundry上的应用程序之间存在许多不同之处。所有

我们部署了我们的应用程序(Spring Boot App),并在PCF中运行了几天,请求得到处理,容器内存逐渐增加,达到80%或90%,但根本没有减少。应用程序一度崩溃

CPU行为似乎很好,当有负载时,它会再次出现尖峰和下降。它在本地机器中运行良好。我猜GC在PCF容器中没有正常发生

有没有人面对过这个问题,有没有人能帮助我们

它在本地机器上运行良好

这几乎可以肯定是苹果对橙子的比较(即,不是有效的比较)。很可能在您的本地环境和运行在CloudFoundry上的应用程序之间存在许多不同之处。所有这些差异都会影响应用程序的运行方式

我的建议是使用
cf local
cf cli插件在本地运行应用程序。这将允许您在docker容器中本地运行应用程序。它的好处是使用将在Cloud Foundry上运行的相同构建包来暂存应用程序,并且它还将在容器中运行您的应用程序,该容器的内存限制与您在Cloud Foundry上运行的应用程序相同。这仍然不完全一样,但它让你更接近

除此之外:

  • 始终确保您使用的是最新的Java buildpack版本。在写这篇文章的时候,没有人应该还在使用3.x。如果你正在运行3.x&看到崩溃,升级,它们很有可能就消失了

    版本4.x对内存使用方式有很多改进 经过计算,因此在防止JVM超过 容器中的内存限制并导致应用程序崩溃。有 甚至在4.x版本中也进行了增量改进,因此 为什么要运行可用的最新版本

  • 如果您看到OutOfMemoryError异常,这只意味着您正在耗尽堆或其他内存段。您可能只需要增加应用程序的内存限制并重新启动。Java buildpack将根据新的内存限制重新计算不同的内存区域,最终您将获得更多的内存。或者,您可以设置
    JAVA_OPTS
    并手动调整JVM的内存设置,但除非您是专家,否则不建议这样做

    如果增加内存没有帮助,或者您已经增加了多次,但仍然没有内存,那么可能是内存泄漏。寻求APM工具或探查器的帮助来调试泄漏

  • 如果容器在退出137时崩溃(意味着您的应用程序超出了设置的内存限制)&您正在运行最新的Java buildpack,请查看您的应用程序是否使用本机内存(即JNI)进行任何操作,即使是从依赖库中。这可能会无限增长,并导致您超出内存限制

  • 与#3类似,查看应用程序使用的线程数。Java buildpack估计了合理的线程数,但它不能限制JVM或应用程序可以创建的线程数。如果应用程序超出Java buildpack估计的线程数,那么您可能会超出内存限制,导致应用程序崩溃。要解决此问题,您可以增加估计的线程数,增加应用程序中的内存限制或减少/限制线程使用

  • 如果其他一切都失败了,你可以。这有点棘手,但它可以让您很好地了解JVM在哪里使用内存。在应用程序的生命周期中抓取一些快照,您通常可以看到哪个部分正在增长,哪个部分导致应用程序崩溃。有几种方法可以对运行在CF上的应用程序执行此操作,有关详细信息,请参阅和

  • 它在本地机器上运行良好

    这几乎可以肯定是苹果对橙子的比较(即,不是有效的比较)。很可能在您的本地环境和运行在CloudFoundry上的应用程序之间存在许多不同之处。所有这些差异都会影响应用程序的运行方式

    我的建议是使用
    cf local
    cf cli插件在本地运行应用程序。这将允许您在docker容器中本地运行应用程序。它的好处是使用将在Cloud Foundry上运行的相同构建包来暂存应用程序,并且它还将在容器中运行您的应用程序,该容器的内存限制与您在Cloud Foundry上运行的应用程序相同。这仍然不完全一样,但它让你更接近

    除此之外:

  • 始终确保您使用的是最新的Java buildpack版本。在写这篇文章的时候,没有人应该还在使用3.x。如果你正在运行3.x&看到崩溃,升级,它们很有可能就消失了

    版本4.x对内存使用方式有很多改进 经过计算,因此在防止JVM超过 容器中的内存限制并导致应用程序崩溃。有 甚至在4.x版本中也进行了增量改进,因此 为什么要运行可用的最新版本

  • 如果您看到OutOfMemoryError异常,这只意味着您正在耗尽堆或其他内存段。您可能只需要增加应用程序的内存限制并重新启动。Java buildpack将根据新的内存限制重新计算不同的内存区域,最终您将获得更多的内存。或者,您可以设置
    JAVA_OPTS
    并手动调整JVM的内存设置,但除非您是专家,否则不建议这样做

    如果增加内存没有帮助,或者您已经增加了多次,但仍然没有内存,那么可能是内存泄漏。寻求APM工具或探查器的帮助来调试泄漏

  • 如果容器是c