作者: | 来源:互联网 | 2023-09-25 12:11
我发现我的一个springboot项目的内存(RAM消耗)一天天增加。当我将jar文件上传到AWS服务器时,它占用了582MB的RAM(最大分配的RAM为1500
我发现我的一个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
在命令行中使用,我创建了一个堆转储并将其上传到Heap Hero和Eclipse Memory Analyzer Tool。在他们两个中,我发现了以下内容:
1.总浪费内存为:64.69MB (73%)(查看下面的截图)
2 . 其中,34.06MB 被Byte [] array
和LinkedHashmap[]
(检查下面的截图)占用,我从未在我的整个项目中使用过。我在我的项目中搜索了它,但没有找到。
3 . 以下 2 个大对象分别占用 32 MB 和 20 MB。
1. Java Static io.netty.buffer.ByteBufUtil.DEFAULT_ALLOCATOR
2. Java Static com.mysql.cj.jdbc.AbandonedConnectionCleanupThread.connectionFinalizerPhantomRefs`
所以我试图找到这个netty.buffer。在我的项目中,但我没有找到任何与 netty 或缓冲区匹配的内容。
现在我的问题是如何减少这种内存泄漏,或者如何找到确切的内存消耗对象/类/变量,以便我可以减少堆大小。
我知道很少有专家会要求提供源代码或任何类似的东西,但我相信从堆转储中我们可以找到内存泄漏或内存中可用的活动对象。我正在寻找那个选项或任何减少这个堆转储的东西!
过去 3 周我一直在研究这个问题。任何帮助,将不胜感激。谢谢!