什么是脏私人记忆?

时间:2013-05-26 18:45:01

标签: linux memory-management memory-leaks heap

我正在64位Linux系统上开发应用程序。正如我所看到的,我的应用程序正在吃太多脏堆内存。谈论堆内存,“脏”是什么意思?是什么使它出现以及可以采取哪些措施来防止它出现?

修改

我最好解释一下我的应用程序执行的操作。

我的应用程序在两个线程中运行:第一个线程将作业发送到队列,然后在另一个线程中执行。因此,第一个线程分配要排队的页面,第二个线程将它们排队,执行它们的作业并释放它们。所有这些操作都以线程安全的方式执行。

所以我对这个东西进行了测试,使它排队100000000个作业并执行它们。在特定时刻之前,内存使用量会增加。然后,当排队过程结束并且仅剩余出队时,内存使用莫名其妙地不会减少。最后,当所有作业都出列并执行时,释放所有内存。因此,内存泄漏似乎在出列过程中发生,因为当它完成所有内存被释放时,我发现它的代码没有错。

我知道如果我在这里发布我的代码会更好,但它太大了。但是,根据我的补充,是否有人猜测可能导致这种情况的原因?

2 个答案:

答案 0 :(得分:3)

我发现了这个

  

Inact_dirty:Dirty意味着“可能需要写入磁盘或交换。”需要   更多工作要自由。示例可能是尚未编写的文件   到了。它们不会太快写入内存以保持记忆   I / O下来。例如,如果您正在编写日志,那么可能会更好   等到完成日志准备就绪后再发送到磁盘。

从这里采取:http://www.redhat.com/advice/tips/meminfo.html

我想这与I / O缓冲区上的脏位非常相似? 我的意思是说有一点表明这个缓冲区应该写在磁盘上,因为它已被修改(在linux上)。

您有类似的问题:https://unix.stackexchange.com/questions/33381/getting-information-about-a-process-memory-usage-from-proc-pid-smaps

答案 1 :(得分:3)

谈论即使在释放一些块之后内存不减少,你最好在匿名模式中使用mmap,如下所示:

mmap(NULL, chunck_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);

,它不映射文件描述符,并返回指向内存块的指针,当您取消映射时,该内存块会立即返回到操作系统。但是,mmap需要系统调用,这比malloc慢。因此,您应该使用mmap来分配大页面。