windows任务管理器确定程序内存使用情况的可靠性如何?
How reliable is windows task manager for determining memory usage of programs?
我可以使用任务管理器检测巨大的内存泄漏吗?我有一个小的文本解析程序,当我启动它时,它显示内存使用量约为640K。当我解析一个文件并对其进行索引时,内存使用量会根据文件的大小而增长。然后,当我"清除"索引时,我的内存使用量下降到大约1400K。在此之后,我可以添加任意数量的文件,当我清除索引时,内存使用下降到1400k +或- 5%。
这是在我对程序进行了更改之后。在更改之前,每次我索引一些文件时,内存使用量都会继续上升,然后清除。因此,在多次清除之后,我的程序的内存使用量越来越大。
我意识到这可能是一种"黑客"的方式来配置我的应用程序,但我是一名学生,我所能找到的都是遥不可及的商业分析工具。我也读过valgrind,它只支持linux,我正在windows上开发。使用任务管理器是准确的还是我被误导了?
TaskMgr对于这个目的来说太粗糙了。特别是如果您有大量的动态分配和释放,这将导致高度碎片化的堆内存,在这种情况下,很难区分由于碎片而导致的堆泄漏和自然增长。您应该使用win32 API调用来检查应用程序分配的内存总量。几年前,当我仍然有内存泄漏的问题时(多亏了RAII不再有这些问题了),我曾经在main()的开头放一小段代码,用于查询堆上分配的内存块的总量,然后在main()函数的最后再次查询,如果两个值不匹配,我会在那时报告一个"内存泄漏X字节"错误。
如果你想这样做,你可以使用GlobalMemoryStatuxEx或HeapWalk。前者使用更简单、更快,但更粗糙;后者更精确,但更广泛。
TaskMgr是一个非常粗糙的工具,但它仍然很有用。如果您的内存泄漏在1兆字节范围内,那么很可能就足以说明您存在内存泄漏。但是,最终,您将寻找在10kb及以下范围内的泄漏,而TaskMgr对于这些泄漏是无用的。
- 在没有太多条件句的情况下,我如何避免被零除
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 函数中堆分配的效果与缺少堆分配的情况
- 在未初始化映射的情况下,将值插入到映射的映射中
- 是默认情况下分配给char数组常量的值
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 如何在不产生任何垃圾的情况下获得C中的像素
- 在已经使用Git的情况下减少编译时间
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 如何在没有信号的情况下从C++执行QML插槽
- 如何在不知道向量大小的情况下输入向量内部的向量?
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 为什么在某些情况下不写入此文件?
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 在没有Xcode的情况下在Mac捆绑包中嵌入框架
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- UE4-如何在给定4个屏幕坐标的情况下缩放纹理或材质
- 为什么这个音频包络不能通过开关的情况?
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- windows任务管理器确定程序内存使用情况的可靠性如何?