gpt4 book ai didi

c - 另一个内存泄漏问题(程序终止时内存仍然消失)- SLES 上的 C 程序

转载 作者:太空狗 更新时间:2023-10-29 16:08:29 26 4
gpt4 key购买 nike

我在 Suse Linux Enterprise 上运行我的 C 程序,它压缩了数千个大文件(大小在 10MB 到 100MB 之间),随着程序的运行,程序变得越来越慢(它在 Intel 上以 32 线程的多线程运行沙桥板)。当程序完成并再次运行时,它仍然很慢。

当我观察程序运行时,我看到内存在程序运行时被耗尽,你会认为这只是一个典型的内存泄漏问题。但是,由于正常的 malloc()/free() 不匹配,我希望所有内存在程序终止时返回。但是,当程序完成时,大部分内存都不会被回收。 free 或 top 命令显示 Mem: 63996M total, 63724M used, 272M free 当程序变慢到停止时,但是,终止后,空闲内存仅增长回约 3660M。当程序重新运行时,空闲内存很快就会用完。

top 程序只显示该程序在运行时最多使用 4% 左右的内存。

我认为这可能是一个内存碎片问题,但是,我构建了一个小测试程序来模拟程序中的所有内存分配事件(内置了许多随机方面 - 大小/数量),它总是返回所有完成后的内存。所以,我不认为是这样。

问题:

  1. malloc()/free() 不匹配是否会永久丢失内存,即即使在进程完成之后?

  2. C 程序(不是 C++)中还有哪些其他事情会导致永久性内存丢失,即在程序完成后,甚至终端窗口关闭?只有重新启动才能恢复内存。我读过其他关于文件未关闭导致问题的帖子,但我认为我没有遇到这个问题。

  3. 查看内存统计信息的 top 和 free 是否有效,即它们是否准确描述了内存情况?它们似乎确实与程序的缓慢相对应。

  4. 如果程序只显示 4% 的内存使用,valgrind 之类的程序会发现这个问题吗?

最佳答案

会不会有 malloc()/free() 不匹配会永久丢失内存,即即使在进程完成之后?

不,免费,甚至是在这方面是无害的,当进程终止操作系统(在本例中为 SUSE Linux)时,会收回所有内存(除非它与仍在运行的其他进程共享)。

C 程序(不是 C++)中还有哪些其他事情会导致永久性内存丢失,即在程序完成后,甚至终端窗口关闭?只有重新启动才能恢复内存。我读过其他关于文件未关闭导致问题的帖子,但我认为我没有遇到这个问题。

与 malloc/free 和 mmap 一样,进程打开的文件会被操作系统自动关闭。

有一些东西会导致永久性内存泄漏,例如大页面,但如果您正在使用它们,您肯定会知道。除此之外,没有。


但是,如果您将内存丢失定义为内存未立即标记为“空闲”,那么可能会发生一些事情。

  1. 写入磁盘或 mmap 可能会在 RAM 中缓存一段时间。操作系统必须保留这些页面,直到将它们同步回磁盘。
  2. 如果操作系统现在没有其他东西可以使用该 RAM,则进程读取的文件可能会保留在内存中 - 合理的假设是它可能很快就会需要它们,并且读取 RAM 中已有的副本会更快。同样,如果操作系统或其他进程需要部分 RAM,可以立即将其丢弃。

请注意,作为为我的所有 RAM 付费的人,我宁愿操作系统一直使用所有内存,如果它能以最小的方式提供帮助的话。免费 RAM 是浪费的 RAM。


空闲 RAM 很少的主要问题是当它被过度使用 时,也就是说现在请求或使用 RAM 的进程(和操作系统)多于系统上可用的 RAM .听起来你在你的进程中使用了大约 4Gb 的 RAM,这可能是一个问题 - (记住操作系统也需要一个好的 block 。但听起来你有足够的 RAM!尝试运行一半的进程并查看如果它变得更好。

有时,内存泄漏 会导致暂时的过度使用 - 最好对此进行调查。尝试绘制程序随时间推移的内存使用情况 - 如果它持续上升,则很可能是泄漏。

请注意,fork进程会创建一个副本,该副本共享原始分配的内存 - 直到两者都关闭或其中一个“exec”。但你没有那样做。

查看内存统计信息的 top 和 free 是否有效,即它们是否准确描述了内存情况?它们似乎确实与程序的缓慢相对应。


是的,topps 是查看内存的非常合理的方式,尤其是观察 RES 字段。现在忽略 VIRT 字段。此外:

要查看整个系统对内存的处理情况,请运行:

vmstat 10

当您的程序正在运行时以及之后的一段时间。查看 ---memory--- 列发生了什么。

此外,在您的流程完成后,运行

cat /proc/meminfo

并在您的问题中发布结果。

如果程序只显示 4% 的内存使用,valgrind 之类的程序会发现这个问题吗?

可能,但它可能非常慢,在这种情况下这可能是不切实际的。还有很多其他工具可以提供帮助,例如 electricfence and others这不会显着降低您的程序。过去我什至自己也推出过。

关于c - 另一个内存泄漏问题(程序终止时内存仍然消失)- SLES 上的 C 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12327707/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com