我在 Suse Linux Enterprise 上运行我的 C 程序,该程序压缩了数千个大文件(大小在 10MB 到 100MB 之间),并且随着程序运行,程序变得越来越慢(它在 Intel Sandy Bridge 板上以 32 个线程运行多线程)。当程序完成并再次运行时,它仍然很慢。
当我看到程序运行时,我看到程序运行时内存正在耗尽,你会认为这只是一个典型的内存泄漏问题。但是,对于正常的 malloc()/free() 不匹配,我希望在程序终止时所有内存都会返回。但是,当程序完成时,大部分内存都不会被回收。free 或 top 命令显示 Mem: 63996M total, 63724M used, 272M free 当程序减速到停止时,但在终止后,空闲内存只增长到大约 3660M。当程序重新运行时,空闲内存很快就用完了。
上面的程序只显示该程序在运行时最多使用 4% 左右的内存。
我认为这可能是一个内存碎片问题,但是,我构建了一个小型测试程序来模拟程序中的所有内存分配活动(许多随机方面是内置的 - 大小/数量),它总是返回所有内存完成。所以,我不认为是这样。
问题:
是否存在会永久丢失内存的 malloc()/free() 不匹配,即即使在进程完成之后?
C 程序(不是 C++)中的哪些其他内容会导致永久内存丢失,即在程序完成后,甚至终端窗口关闭?只有重新启动才能恢复内存。我读过其他关于文件未关闭导致问题的帖子,但是,我认为我没有这个问题。
查看内存统计信息的顶部和空闲是否有效,即它们是否准确地描述了内存情况?它们似乎确实对应于程序的缓慢性。
如果程序只显示 4% 的内存使用,那么 valgrind 之类的会发现这个问题吗?