Activer LFH en ASP.NET

Bonjour,

Dans le précédent article relatif à la fragmentation mémoire sous IIS6, nous avons vu qu'il est possible d'activer "LFH" sur le tas par défaut d'un processus en utilisant un objet COM. Il est aussi possible de réaliser cette opération en ASP.NET. L'exemple suivant permet d'activer "LFH" au démarrage d'une application .NET en modifiant le "code behind" du fichier global.asax de l'application (Global.asax.cs) :

namespace WebApplication1
{

unsafe class LFHClass
{

[DllImport("kernel32.dll", SetLastError = true)]
static extern uint HeapSetInformation(
IntPtr HeapHandle,
int HeapInformationClass,
void* HeapInformation,
uint HeapInformationLength
);

[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr GetProcessHeap();

public uint EnableLFH()
{

uint HeapFragValue = 2;
return HeapSetInformation(GetProcessHeap(), 0, &HeapFragValue, sizeof(uint));

}

}

public class Global : System.Web.HttpApplication
{

protected void Application_Start(object sender, EventArgs e)
{

LFHClass lfhobj = new LFHClass();
Application.Add("LFHEnabled",lfhobj.EnableLFH());

}

}

L'activation de "LFH" n'aura d'intêret que si :

  • Le système d'exploitation utilisé est Windows 2003 (ou Windows 2000 avec le patch « LFH » 816542). Pour rappel, LFH est activé de base sous Windows Vista & Windows 2008
  • Le processus IIS qui héberge l'application (en général W3WP.EXE) héberge des composants non managés utilisant massivement le tas par défaut

Il est par conséquent inutile d'activer "LFH » dans une application purement .NET.

@ Bientôt

Emmanuel Boersma et L'équipe de support IIS Microsoft France