Поделиться через


Кучи с низкой фрагментацией

[Сведения в этом разделе относятся к Windows Server 2003 и Windows XP. Начиная с Windows Vista система использует кучу с низкой фрагментацией (LFH) при необходимости для запросов на выделение памяти службы. Приложениям не нужно включать LFH для их куч.]

Фрагментация кучи — это состояние, в котором доступная память разбивается на небольшие неконтиговые блоки. Если куча фрагментирована, выделение памяти может завершиться ошибкой даже в том случае, если общий объем доступной памяти в куче достаточно для удовлетворения запроса, так как ни один блок памяти недостаточно велик. Кучи с низкой фрагментацией (LFH) помогает уменьшить фрагментацию кучи.

LFH не является отдельной кучей. Вместо этого это политика, которую приложения могут включить для кучи. Если LFH включен, система выделяет память в определенных предопределенных размерах. Когда приложение запрашивает выделение памяти из кучи с включенным LFH, система выделяет наименьший блок памяти, который достаточно велик, чтобы содержать запрошенный размер. В текущей реализации система не использует LFH для выделения, превышающего приблизительно 16 КБ, независимо от того, включен ли LFH.

Приложение должно включить LFH только для кучи по умолчанию вызывающего процесса или для частных куч, созданных приложением. Чтобы включить LFH для кучи, используйте функцию GetProcessHeap, чтобы получить дескриптор вызывающего процесса по умолчанию или использовать дескриптор для частной кучи, созданной функцией HeapCreate. Затем вызовите функцию HeapSetInformation с дескриптором.

LFH нельзя включить для кучи, созданные с помощью HEAP_NO_SERIALIZE или для куч, созданных с фиксированным размером. LFH также нельзя включить, если вы используете средства отладки кучи в средства отладки для Windows или средства проверки приложений.

После включения LFH для кучи его нельзя отключить.

Приложения, которые чаще всего используют LFH, — это многопоточные приложения, которые часто выделяют память и используют различные размеры выделения ниже 16 КБ. Однако не все приложения получают преимущества от LFH. Чтобы оценить последствия включения LFH в приложении, используйте данные профилирования производительности.