低碎片堆
[本主题中的信息适用于 Windows Server 2003 和 Windows XP。 从 Windows Vista 开始,系统根据需要使用低碎片堆(LFH)来服务内存分配请求。 应用程序不需要为其堆启用 LFH。]
堆碎片是一种状态,在此状态下,可用内存被分解为小型非连续块。 当堆碎片化时,即使堆中的可用内存总量足以满足请求,内存分配也会失败,因为没有一个内存块足够大。 低碎片堆(LFH)有助于减少堆碎片。
LFH 不是单独的堆。 而是应用程序可以为其堆启用的策略。 启用 LFH 后,系统会在某些预先确定的大小中分配内存。 当应用程序从启用了 LFH 的堆请求内存分配时,系统会分配足够大的最小内存块来包含所请求的大小。 在当前实现中,无论是否启用 LFH,系统都不会将 LFH 用于大于约 16 KB 的分配。
应用程序应仅对调用进程的默认堆或 专用堆启用 LFH, 应用程序已创建。 若要为堆启用 LFH,请使用 GetProcessHeap 函数获取对调用进程的默认堆的句柄,或使用 HeapCreate 函数创建的专用堆的句柄。 然后使用句柄调用 HeapSetInformation 函数。
不能为使用 HEAP_NO_SERIALIZE 创建的堆或固定大小的堆启用 LFH。 如果在适用于 Windows 的 调试工具或 应用程序验证程序中使用堆调试工具,则也不能启用 LFH。
为堆启用 LFH 后,无法禁用它。
从 LFH 中受益最多的应用程序是多线程应用程序,这些应用程序经常分配内存,并且使用各种分配大小,且可舒适地低于 16 KB。 但是,并非所有应用程序都受益于 LFH。 若要评估在应用程序中启用 LFH 的影响,请使用性能分析数据。