我发现我的一个 Spring Boot 项目的内存(RAM 消耗)日益增加。当我将 jar 文件上传到 AWS 服务器时,它占用了 582 MB 的 RAM(最大分配的 RAM 为 1500 MB),但是每天,RAM 都会增加 50MB 到 100 MB,今天 5 天后,它占用了 835 MB 。目前该项目拥有 100-150 个用户,并且正常使用 Rest API。
由于 RAM 的增加,应用程序有几次出现以下错误(从日志中发现的错误):
Exception in thread "http-nio-3384-ClientPoller" java.lang.OutOfMemoryError: Java heap space
因此,为了解决这个问题,我发现通过使用 JAVA Heap Dump,我可以找到占用内存的对象/类。所以通过使用Jmap
在命令行中,我创建了一个堆转储并将其上传到堆英雄 and Eclipse 内存分析器工具。在这两篇文章中我发现了以下内容:
1.总浪费内存为:64.69MB (73%)(查看下面的屏幕截图)
2。其中,34.06MB 被占用Byte [] array
and LinkedHashmap[]
(查看下面的屏幕截图),我在整个项目中从未使用过它。我在我的项目中搜索过但没有找到。
3. Following 2 large objects taking 32 MB and 20 MB respectively.
1. Java Static io.netty.buffer.ByteBufUtil.DEFAULT_ALLOCATOR
2. Java Static com.mysql.cj.jdbc.AbandonedConnectionCleanupThread.connectionFinalizerPhantomRefs`
所以我试图找到这个netty.buffer。在我的项目中,但我没有找到任何与 netty 或 buffer 匹配的内容。
现在我的问题是我怎样才能减少这种内存泄漏 or 如何找到确切的内存消耗对象/类/变量这样我就可以减少堆大小。
我知道很少有专家会要求源代码或类似的东西,但我相信从堆转储中我们可以查找内存泄漏或内存中可用的活动对象。我正在寻找该选项或任何可以减少堆转储的选项!
过去三周我一直在研究这个问题。任何帮助,将不胜感激。
谢谢你!