什么原因会导致非活动内存增加以及如何回收它?

什么原因会导致非活动内存增加以及如何回收它?

我在 CentOS 服务器上运行了一个大型应用程序,并且发现了奇怪的内存行为。以下是 munin 图的快照: 替代文本

如您所见,已提交内存的数量逐渐增加,导致交换文件被使用。令我感到奇怪的是,非活动内存的数量也在不断增长。据我所知,非活动内存实际上是释放的内存,但尚未被操作系统清理并放回可用内存池中。似乎内存耗尽实际上是由于缺乏清理造成的,但我可能错了。

您能否提供一些提示来查找问题的原因和/或使 CentOS 回收不活动的内存?

谢谢。

一些额外的信息:

1)我在 /tmp 上安装了 tmpfs,并且存储在那里的文件数量在增长(但它是非活动内存数量的两倍)。

2)cat /proc/meminfo(在图像的后期)给出:

MemTotal:     14371428 kB
MemFree:       1207108 kB
Buffers:         35440 kB
Cached:        4276628 kB
SwapCached:     785316 kB
Active:        9038924 kB
Inactive:      3902876 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:     14371428 kB
LowFree:       1207108 kB
SwapTotal:    10223608 kB
SwapFree:      6438320 kB
Dirty:          627792 kB
Writeback:           0 kB
AnonPages:     7844560 kB
Mapped:          49304 kB
Slab:           146676 kB
PageTables:      27480 kB
NFS_Unstable:        0 kB
Bounce:              0 kB
CommitLimit:  17409320 kB
Committed_AS: 16471488 kB
VmallocTotal: 34359738367 kB
VmallocUsed:    275852 kB
VmallocChunk: 34359462007 kB
HugePages_Total:     0
HugePages_Free:      0
HugePages_Rsvd:      0
Hugepagesize:     2048 kB

3)该应用程序是MySQL,Heritrix的组合(http://crawler.archive.org/) 和一个基于 Tomcat 的 Java servlet 来管理事物。

答案1

据我了解,非活动内存实际上是已释放但尚未被操作系统清理并放回可用内存池中的内存。

这是错误的。“非活动”内存是活动映射的内存,一段时间内未被任何应用程序使用。当需要交换时,将从标记为这样的页面中取出内存并将其换出。它还可用于换出以支持页面缓存。

如您所见,已提交内存量逐渐增加,导致交换文件被使用。令我感到奇怪的是,非活动内存量也在不断增长。

两者不一定相关,但对我来说,这看起来就像是内存泄漏。没有任何应用程序访问的页面数量在增加,交换空间也在增加,这表明有东西在分配内存,然后忘记了它,之后没有释放它。

例如,如果调用 malloc(),内存可能处于“非活动”状态。这是一个 libc 调用,可能会分配一块内存,但实际上只有一部分内存用于执行任何工作(少于分配的页面数量)。即使您在 malloc 中释放内存,也并不意味着您通过要求操作系统这样做来释放内存,只是 mallocs 表可能将其标记为“可重用”,之后可能会释放它。

答案2

这是什么应用程序?它有内存泄漏吗?也就是说,如果您的应用程序终止,内存是否会返回给操作系统?

如果您的应用程序正在泄漏内存,您需要使用类似电围栏的东西来查找这些问题并纠正它们。

您的应用程序是用什么编写的?您需要使用适合其编写语言的正确调试器。

我非常怀疑操作系统是否正在泄漏内存,除非您的应用程序消耗了大量资源并且没有正确释放它们。

此外,您的内存图非常繁忙且难以理解,那里有大约 20 种颜色,非常模糊。

您认为这是您的 RAM 磁盘的问题吗?它可能会扩大以满足需求,但是在需要时它不会缩减。

相关内容