6

我正在 64 位 Linux 系统上开发应用程序。正如我所看到的,我的应用程序正在消耗太多脏堆内存。说到堆内存,“脏”是什么意思?是什么导致了它的出现以及可以做些什么来防止它出现?

编辑

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

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

所以我对这个东西进行了测试,让它排队 100000000 个作业并执行它们。直到某个特定时刻,内存使用量才会增长。然后,当排队过程完成并且只剩下出队的时候,内存使用量莫名其妙地没有减少。最后,当所有作业都出列并执行时,所有内存都会被释放。因此,内存泄漏似乎发生在出队过程中,因为当它完成时所有内存都被释放,但我发现它的代码没有任何问题。

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

4

2 回答 2

3

我找到了这个

Inact_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

于 2013-05-26T19:01:07.053 回答
3

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

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

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

于 2013-06-16T18:50:39.840 回答