windows任务管理器确定程序内存使用情况的可靠性如何?

How reliable is windows task manager for determining memory usage of programs?

本文关键字:情况 可靠性 用情 任务管理器 程序 内存 windows      更新时间:2023-10-16

我可以使用任务管理器检测巨大的内存泄漏吗?我有一个小的文本解析程序,当我启动它时,它显示内存使用量约为640K。当我解析一个文件并对其进行索引时,内存使用量会根据文件的大小而增长。然后,当我"清除"索引时,我的内存使用量下降到大约1400K。在此之后,我可以添加任意数量的文件,当我清除索引时,内存使用下降到1400k +或- 5%。

这是在我对程序进行了更改之后。在更改之前,每次我索引一些文件时,内存使用量都会继续上升,然后清除。因此,在多次清除之后,我的程序的内存使用量越来越大。

我意识到这可能是一种"黑客"的方式来配置我的应用程序,但我是一名学生,我所能找到的都是遥不可及的商业分析工具。我也读过valgrind,它只支持linux,我正在windows上开发。使用任务管理器是准确的还是我被误导了?

TaskMgr对于这个目的来说太粗糙了。特别是如果您有大量的动态分配和释放,这将导致高度碎片化的堆内存,在这种情况下,很难区分由于碎片而导致的堆泄漏和自然增长。您应该使用win32 API调用来检查应用程序分配的内存总量。几年前,当我仍然有内存泄漏的问题时(多亏了RAII不再有这些问题了),我曾经在main()的开头放一小段代码,用于查询堆上分配的内存块的总量,然后在main()函数的最后再次查询,如果两个值不匹配,我会在那时报告一个"内存泄漏X字节"错误。

如果你想这样做,你可以使用GlobalMemoryStatuxEx或HeapWalk。前者使用更简单、更快,但更粗糙;后者更精确,但更广泛。

TaskMgr是一个非常粗糙的工具,但它仍然很有用。如果您的内存泄漏在1兆字节范围内,那么很可能就足以说明您存在内存泄漏。但是,最终,您将寻找在10kb及以下范围内的泄漏,而TaskMgr对于这些泄漏是无用的。