低碎片堆

[本主题中的信息适用于 Windows Server 2003 和 Windows XP。 从 Windows Vista 开始,系统根据需要使用低碎片堆 (LFH) 来为内存分配请求提供服务。 应用程序不需要为其堆启用 LFH。]

堆碎片是一种状态,其中可用内存被分解为较小的非连续块。 当堆被碎片化时,即使堆中的可用内存总量足以满足请求,内存分配也可能会失败,因为没有一个内存块足够大。 低碎片堆 (LFH) 有助于减少堆碎片。

LFH 不是单独的堆。 相反,它是应用程序可以为其堆启用的策略。 启用 LFH 后,系统会以某些预先确定的大小分配内存。 当应用程序从启用了 LFH 的堆请求内存分配时,系统会分配足够大以包含所请求大小的最小内存块。 在当前实现中,无论是否启用了 LFH,系统都不会对大于大约 16 KB 的分配使用 LFH。

应用程序应仅为调用进程的默认堆或应用程序创建的 专用堆 启用 LFH。 若要为堆启用 LFH,请使用 GetProcessHeap 函数获取调用进程的默认堆的句柄,或使用 HeapCreate 函数创建的专用堆的句柄。 然后使用 句柄调用 HeapSetInformation 函数。

不能为使用 HEAP_NO_SERIALIZE 创建的堆或以固定大小创建的堆启用 LFH。 如果使用 Windows 或应用程序验证程序调试工具中的堆调试工具,则也无法启用 LFH。

为堆启用 LFH 后,无法禁用它。

从 LFH 中获益最多的应用程序是多线程应用程序,这些应用程序经常分配内存,并且使用各种分配大小(轻松低于 16 KB)。 但是,并非所有应用程序都受益于 LFH。 若要评估在应用程序中启用 LFH 的影响,请使用性能分析数据。