【发布时间】:2011-10-03 01:37:31
【问题描述】:
做一些分析(内存和速度)我被win7似乎分配的内存正好是我要求的两倍的事实所困扰......注意这是我第一次在win7上进行这样的主动分析,所以我真的不知道会发生什么。
我正在使用 win7(64 位)下的快速版 MSVC 在循环中分配精确数量的 RAM。该应用程序已编译并以 32 位运行。
我分配了 24 MB 的内存,任务管理器显示我的应用程序正在使用 48MB(在所有内存列下,包括已提交,因为我实际上是在新区域内进行内存复制)。当我再获得 24 个(现在应该是 48MB)时,我的应用会跳到 96 个,等等。
这些被分配为 1,000,000 个 24 字节结构。
我在网上搜索过,但没有找到与我的观察完全相符的东西。
有人知道吗?
如果这只是操作系统的诡计(或无能?),是否有任何工具可以让我了解进程的实际内存消耗? (当应用程序开始涌现时,很难找到泄漏;-)
[-----------已编辑,附加信息-----------]
注意(通过控制台标题栏中的路径)我在发布模式下构建(使用 MSVC 2010 的所有默认“空”项目设置),因此没有分配额外的“调试”内存(可以是在某些项目上相当广泛)。
这是一个简短、完整的 C 应用程序,用于说明该行为:
#include <stdio.h>
#include <assert.h>
#include <conio.h>
#include <stdlib.h>
typedef unsigned int u32;
typedef struct myStruct MYS;
struct myStruct {
u32 type;
union {
u32 value;
char * str;
void * data;
MYS ** block;
MYS * plug;
};
u32 state, msg, count, index;
};
int main(int argc, char *argv[]){
int i, j;
MYS *ref;
printf ("size of myStruct: %d\n\n", sizeof(MYS));
for(i=0; i < 10; i ++){
printf("allocating started...\n");
for (j = 0; j < 1000000 ; j ++){
ref = (MYS *) malloc(sizeof(MYS));
assert(ref);
memset(ref, 0, sizeof(MYS));
}
printf(" Done... Press 'enter' for Next Batch\n");
_getch();
}
_getch();
return 0;
}
还有一张图片显示了我的机器在一个循环后的内存。每隔一次运行,它就会增加约 48MB 而不是 24MB!
【问题讨论】:
-
你能显示你分配内存的那一行吗?
-
你确定这个结构真的是24字节吗?可能会有一些对齐来填充它。
-
已编辑问题...我添加了一个完整的代码示例,其中包含额外的构建细节和一个循环后我的任务管理器的图片。希望这会有所帮助:-)
-
也许操作系统会主动保留更多内存,因为它知道它会在其他迭代中这样做(可能由编译器暗示)?也许您泄漏内存的事实正在影响它?您是否尝试过让它运行所有 10 次迭代?
-
查看 SysInternal 的 VMMap。可能会对程序的内存消耗有所了解。