什么会导致无效内存增加以及如何回收?

我在CentOS服务器上运行繁重的应用程序,我看到一个奇怪的内存行为。 这里是一个munin图的快照: 替代文字

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

你能提供一些技巧来找出问题的原因,并且/或者让CentOS回收不活动的内存?

谢谢。

一些额外的信息:

1)我有一个tmpfs挂载在/ tmp和存储在那里的文件数量增长(但它是非活动内存量的两倍)。

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的组合来pipe理事情。

这是我的理解,不活动的内存实际上是释放内存,但尚未清理的操作系统,并放回到可用内存池。

这是错误的。 “不活跃”的内存是主动映射内存,一段时间以来一直没有被任何应用程序利用。 当它交换的时候,内存从标记为这样的页面被取出并被​​换出。 它也可以用来换出页面caching。

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

这两个不一定相互关联,但对我来说,这看起来好像有什么东西在泄漏记忆。 事实上,你的页面没有被任何应用程序访问,而且交换也在增长,这表明事物正在分配内存,忘记了它,然后就没有释放它。

内存可能是“不活跃的”,例如,如果malloc()被调用。 这是一个libc调用,可能会分配一块内存,但只有一部分被用来做任何工作(less于分配的页数)。 即使你使用malloc释放它并不意味着你通过要求操作系统来释放内存,它只是mallocs表可能标记为“可重用”,它可能会释放它。

这个应用程序是什么,它有内存泄漏? 即如果您的应用程序终止,内存是否返回到操作系统?

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

你写的是什么申请书? 您需要为写入的语言使用正确的debugging器。

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

此外,你的记忆图非常非常繁忙,很难理解,那里有大约20种颜色,它就像泥浆一样清晰。

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