私有脏内存可以表明内存泄漏吗?

Posted

技术标签:

【中文标题】私有脏内存可以表明内存泄漏吗?【英文标题】:Can private dirty memory be an indication of leaked memory? 【发布时间】:2014-07-07 11:46:49 【问题描述】:

我有一个应用程序,它的内存随着我运行的测试用例而增加。这显然让我相信我的应用程序正在泄漏内存。所以我在我的应用程序上运行了 valgrind,令人惊讶的是它没有发现任何泄漏。

我不确定为什么我的进程的内存泄漏,所以我查看了我的进程的 smaps 文件 如果我觉得有趣,请在下面

08426000-42f56000 rwxp 00000000 00:00 0                                  [heap]
Size:             961728 kB
Rss:              960252 kB
Pss:              960252 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:    960252 kB
Referenced:       960252 kB
Anonymous:        960252 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:        4 kB

为了理解这些数字,我对 Private_Dirty 内存进行了一些研究,大多数文章都表明这是尚未释放的内存,因为它们很昂贵。

这似乎表明这些只是已被应用程序释放但仍被操作系统保留的内存。

有人可以帮助我更好地理解 private_dirty 吗?这是否表明我有内存泄漏?

谢谢

【问题讨论】:

在清理步骤之后和例程退出之前内存是否变小了?这听起来像是你在持有与导致内存被持有的测试用例相关的东西。你是使用共享指针还是直接处理内存管理? 有一个描述 here 什么是 private-dirty:基本上你的进程已经“使用”(写入)的内存,因此如果换出它需要保存以便为另一个腾出空间过程。本身并不表示您正在泄漏内存。 也许你正在分配大量的小内存然后释放。我无法预测太多,但它与内存碎片有关吗? 你可能没有内存leak——在内存没有被释放但你不再有引用/指针的意义上——但听起来你可能有所谓的内存积累——你不断地为新数据分配新空间,而不是释放/解除分配/取消引用不再需要的旧内存。我会仔细观察你认为你正在释放你不再需要的内存的地方。 您似乎正在做一些不会强制磁盘写入(脏页累积)的事情,除非在您建立干净退出的最后。某处你没有跟上你的簿记。也许刷新一些文件指针?还是关闭并重新打开它们? 【参考方案1】:

似乎是内存等待写入磁盘,系统为此需要一些时间。您的程序必须产生大量写入磁盘文件的结果。

What is dirty private memory?

【讨论】:

以上是关于私有脏内存可以表明内存泄漏吗?的主要内容,如果未能解决你的问题,请参考以下文章

内存泄漏能走多远?

Solaris 中的 prstat SIZE 值增加是不是表明内存泄漏?

NSArray 与 componentsSeparatedByString 内存泄漏

NodeJS 内存增长(内存泄漏)

可以在 Visual Studio 的泄漏检测中隐藏安全的内存泄漏吗?

内存泄漏问题,私有数据正在增加.Net Framework 4