私有脏内存可以表明内存泄漏吗?
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 内存泄漏