Spring (Kotlin) 应用程序运行时的内存消耗行为

Posted

技术标签:

【中文标题】Spring (Kotlin) 应用程序运行时的内存消耗行为【英文标题】:Memory consumption behaviour at runtime of a Spring (Kotlin) application 【发布时间】:2021-10-13 06:44:30 【问题描述】:

我用 Kotlin 和 Coroutine 编写了一个 Spring Boot 应用程序。它利用弹簧反应堆栈(Webflux)。 看运行时的表现,有点被宠坏了。

该图显示了一段时间内的内存和 CPU 消耗。 一开始,我运行了一个渗透测试,导致 CPU 使用率很高,内存不断增加。令我困惑的是,即使应用程序空闲,内存使用量也不会再减少。

这是正常行为还是应用程序有问题?

【问题讨论】:

您检查是否有任何泄漏? 这些图表是如何生成的?特别是,内存使用是否来自 JVM(例如通过 VisualVM 或 jmap)?还是来自操作系统? (我猜是后者。)  请记住,操作系统只知道分配给 JVM 进程的内存量。它不知道有多少分配给了堆,也不知道有多少堆实际在使用中。 (传统上,如果堆已满,JVM 会向操作系统请求更多内存,但即使堆为空,也不会将其返回给操作系统。) 来自操作系统 如果你使用 React,你可能会对我在这里写的答案***.com/questions/68681786/… 感兴趣,因为还需要考虑本机内存使用情况。 【参考方案1】:

这是正常行为还是应用程序有问题?

没有更多信息,就不可能说出来。

这可能是正常行为。 JVM 中的内存由garbage collection 释放。垃圾收集器清理不再使用的对象。它有自己的规则来决定何时以及如何做到这一点。特别是,它会在应用程序需要时尝试释放内存。如果应用程序处于空闲状态并且不需要任何内存来分配新对象,则垃圾收集器可能不会运行。

另一方面,您的应用程序可能仍然持有对某些数据的引用,从而阻止了这些数据被垃圾回收。如果您的应用程序中有任何变量或数据结构仍然持有对对象的引用,则该对象将不会被垃圾回收。随着时间的推移,这最终意味着垃圾收集器将无法释放任何新内存,应用程序将崩溃。

如果您想确定,您应该尝试多次运行测试。如果您的应用程序运行良好,您将看到内存图在堆开始变满时立即下降,然后又逐渐上升。这会产生一个characteristic "sawtooth" 内存使用图。

【讨论】:

好吧,这很有趣。应该没有引用其他数据所以我想这是正常的

以上是关于Spring (Kotlin) 应用程序运行时的内存消耗行为的主要内容,如果未能解决你的问题,请参考以下文章

[Java]程序运行时的内存分配

无法在 Eclipse 中使用 Kotlin 项目运行 Spring Boot

带有 Spring Boot 2.0 @ConfigurationProperties 的 Kotlin 无法正常工作

使用 glfwWindowShouldClose 时的 NPE (Kotlin)

从 cmd 运行时的 Spring Boot 负载测试数据库

在 pom.xml 中为 Kotlin 中的 Spring Boot 项目指定 Main 类