【问题标题】: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——在内存没有被释放但你不再有引用/指针的意义上——但听起来你可能有所谓的内存积累——你不断地为新数据分配新空间,而不是释放/解除分配/取消引用不再需要的旧内存。我会仔细观察你认为你正在释放你不再需要的内存的地方。
  • 您似乎正在做一些不会强制磁盘写入(脏页累积)的事情,除非在您建立干净退出的最后。某处你没有跟上你的簿记。也许刷新一些文件指针?还是关闭并重新打开它们?

标签: c++ linux memory memory-management memory-leaks


【解决方案1】:

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

What is dirty private memory?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    • 2012-09-21
    相关资源
    最近更新 更多