首页 > 解决方案 > 尝试可视化堆碎片

问题描述

我试图测量堆碎片,我将使用这个公式:

碎片 = 1 - (LargestFreeBlockAvailable / TotalFreeMemory)

棘手的部分是找到最大的空闲块。

我发现这段代码允许我显示堆中的所有块: https ://docs.microsoft.com/en-us/windows/win32/toolhelp/traversing-the-heap-list

我正在尝试创建碎片分配和释放越来越大的块:

std::allocator<char> alloc;
char * tmp = alloc.allocate(100);
    alloc.deallocate(tmp,100);
    tmp = alloc.allocate(200);
    alloc.deallocate(tmp,200);
    tmp = alloc.allocate(300);
    alloc.deallocate(tmp, 300);
    tmp = alloc.allocate(400);
    alloc.deallocate(tmp, 400);
    tmp = alloc.allocate(1000);
    alloc.deallocate(tmp, 1000);
    tmp = alloc.allocate(2000);
    alloc.deallocate(tmp, 2000);
    tmp = alloc.allocate(3000);
    alloc.deallocate(tmp, 3000);
    tmp = alloc.allocate(5000);
    alloc.deallocate(tmp, 5000);
    alloc.allocate(15000);

但是当我运行程序时没有看到碎片,只有一个空闲块对应于可用内存: 结果

就像我之前释放的块合并到最后一个大块......堆中没有任何“洞”表明碎片。有人知道避免碎片的机制吗?也许我做错了创建碎片?

先感谢您。抱歉英语不好。

标签: windowsmemoryheap-memoryallocatorfragmentation

解决方案


推荐阅读