我正在为一个应用程序编写内存管理器,作为一个由二十多名编码人员组成的团队的一员。我们的内存配额用完了,我们需要能够看到发生了什么,因为我们似乎只使用了大约 700Mb。我需要能够报告它的去向——碎片化等。有什么想法吗?
hatcat
问问题
237 次
3 回答
3
您可以为此使用现有的内存调试工具,我发现 Memory Validator 1非常有用,它能够跟踪 API 级别(堆、新...)和操作系统级别(虚拟内存)分配并显示虚拟内存映射。
我也发现非常有用的另一个选项是能够基于 VirtualQuery 函数转储整个虚拟空间的地图。我的代码如下所示:
void PrintVMMap()
{
size_t start = 0;
// TODO: make portable - not compatible with /3GB, 64b OS or 64b app
size_t end = 1U<<31; // map 32b user space only - kernel space not accessible
SYSTEM_INFO si;
GetSystemInfo(&si);
size_t pageSize = si.dwPageSize;
size_t longestFreeApp = 0;
int index=0;
for (size_t addr = start; addr<end; )
{
MEMORY_BASIC_INFORMATION buffer;
SIZE_T retSize = VirtualQuery((void *)addr,&buffer,sizeof(buffer));
if (retSize==sizeof(buffer) && buffer.RegionSize>0)
{
// dump information about this region
printf(.... some buffer information here ....);
// track longest feee region - usefull fragmentation indicator
if (buffer.State&MEM_FREE)
{
if (buffer.RegionSize>longestFreeApp) longestFreeApp = buffer.RegionSize;
}
addr += buffer.RegionSize;
index+= buffer.RegionSize/pageSize;
}
else
{
// always proceed
addr += pageSize;
index++;
}
}
printf("Longest free VM region: %d",longestFreeApp);
}
于 2008-09-18T08:58:41.410 回答
1
您还可以从 Tool Help API 中找到有关 Heap32ListFirst/Heap32ListNext 进程中的堆的信息,以及有关使用 Module32First/Module32Next 加载的模块的信息。
“工具帮助”起源于 Windows 9x。Windows NT 上的原始进程信息 API 是 PSAPI,它提供的功能部分(但不完全)与工具帮助重叠。
于 2008-09-18T14:26:35.180 回答