【问题标题】:spring batch: AKS container is not releasing the Memory after the job execution春季批处理:AKS 容器在作业执行后未释放内存
【发布时间】:2021-12-28 04:55:45
【问题描述】:

我在 AKS 容器中运行 spring 批处理应用程序。我看到它在 spring 批处理作业执行后没有释放内存。

它正在执行将近 1.4Gi 的后期作业

我正在使用下面的命令来运行 spring 批处理作业

java -jar jarname 作业名

如果我重新启动 POD,内存使用量约为 100Mi

是否应该使用任何 jar 开关来释放内存?

【问题讨论】:

    标签: java spring spring-batch azure-aks


    【解决方案1】:

    在我看来,您的代码存在内存泄漏,某些对象总是被引用,因此 GC 无法删除它们。

    解决内存泄漏的一般思路是取堆转储,分析它,找出哪些对象占用了堆中的大部分内存,以便您查看相关代码。

    您可以轻松地在 Google 上搜索如何获取堆转储以及使用哪些工具(例如 Eclipse Memory Analyzer Tool)来分析它,例如 this

    【讨论】:

      【解决方案2】:

      可能是内存泄漏,也可能不是。缺少很多信息才能得出结论。您是否对容器设置了内存限制?带有 JVM 的容器往往会使用大量内存,即使当限制很高并且没有相应地调整 JVM 配置时也没有运行任何东西。话虽如此,在您的屏幕截图中似乎您的应用程序在作业完成后仍在运行,Spring 上下文以及作业使用的数据可能仍在内存中,如果它们没有被正确清理。

      您是否考虑过为您的 Spring Batch Job 使用 Job 而不是 K8s 部署?如果有可能,您绝对应该这样做,Spring Batch can easily be configured 在 K8s 作业中运行,这将大大简化和优化集群内的内存管理。

      【讨论】:

        【解决方案3】:

        您是否曾经在本地尝试过您的批处理作业? 使用jstat -gc pid 或者使用一些很棒的工具,例如 JProfiler 或 Java VisualVM。

        【讨论】:

          猜你喜欢
          • 2014-06-30
          • 2018-10-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-19
          • 1970-01-01
          • 2016-03-03
          相关资源
          最近更新 更多