您好,我的 Java 应用程序遇到 OOM 问题。它部署在 Kubernetes 容器中,是一个使用 Spring Boot 微服务架构并处理文件的 API。最初,我没有看到任何导致我怀疑内存泄漏的关键代码故障。因此,我决定使用 VisualVM 来监视应用程序的内存并确定哪些线程消耗最多的资源。我进行了多次测试,并让应用程序运行几个小时,同时执行其他任务(通常每天都会发生 OOM,导致 Kubernetes 重新启动应用程序)。所有这些都让我怀疑文件观察器线程是造成内存泄漏的原因。最初,它在内存中分配很少的字节,但随着时间的推移,它不断增加。此外,当我使用 Eclipse Memory Analyzer 时,该线程被识别为泄漏嫌疑人之一。我附上了 VisualVM 和内存分析器的屏幕截图,以及我正在使用的 Java VM 参数。非常感谢。
可视化虚拟机监控
文件观察器线程
内存泄漏嫌疑人
参数虚拟机
尝试禁用开发工具。
在您的 pom.xml 中,确保其范围是 provided:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>provided</scope>
</dependency>
...并且 maven 插件在构建 jar 文件时将其排除:
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludeDevtools>true</excludeDevtools>
重建您的应用程序 (
mvn clean install
),然后使用 java -jar target/[your-app].jar
从 jar 文件运行它。
再次运行探查器,您应该注意到文件观察器线程不再存在。