Limitation Mémoire par processus
Liens
OS 32-bits et application 32-bits
Les processus 32-bits peuvent utiliser au maximum 4Gio de RAM (2^32 = 4 294 967 296 o).
Mais l'application en elle-même ne pourra en utiliser que 2Gio car le noyau Windows s'en réserve 2Gio.
L'option « LARGEADDRESSAWARE » permet d'étendre la mémoire utilisable par l'application à 3Gio.
OS 64-bits
Application 32-bits
Là encore l'application 32-bits ne peut utiliser que 2Gio.
L'option « LARGEADDRESSAWARE » permet d'étendre la mémoire utilisable par l'application à 4Gio.
Application 64-bits
L'application 64-bits peut utiliser jusqu'à 8Tio.
L'option « LARGEADDRESSAWARE » est activé par défaut sur les les applications 64-bits.
LARGEADDRESSAWARE
L'option « LARGEADDRESSAWARE » indique à l'éditeur de liens que l'application peut gérer des adresses supérieures à 2 gigaoctets.
Test
dumpbin /HEADERS MonApplication.exe
REM si le flag LARGEADDRESSAWARE est activé le résultat doit contenir
REM Application can handle large (>2GB) addresses
REM C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\dumpbin.exe
|
Modification
editbin /LARGEADDRESSAWARE MonApplication.exe
REM suppression du flag
editbin /LARGEADDRESSAWARE:NO MonApplication.exe
REM C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\editbin.exe
|
Test de saturation de la mémoire en C#
var maListe = new List<object>();
while (true)
{
maListe.Add(new object());
}
// Le problème avec List c'est que sa mémoire est ré-allouée lors de l'ajout d'un nouvel élément si elle n'a pas assez de place.
// Le contenu de maListe est donc recopié, ce qui provoque une demande d'allocation mémoire de la taille de maListe.
// maListe va finir par atteindre quelques Go et cette demande d'allocation mémoire trop grande ne permettra pas de faire un test précis.
|
On utilise ici on arborescence d'objets, à chaque pas on ajoute la taille d'un nouvel objet jusqu'à saturation de la mémoire.
public class Program
{
static void Main(string[] args)
{
var objetRacine = new MaClasse();
var sousObjet = recursive(objetRacine);
while (true)
{
sousObjet = recursive(sousObjet);
}
}
static MaClasse recursive(MaClasse sousObjet)
{
sousObjet.SousObjet = new MaClasse();
return sousObjet.SousObjet;
}
}
class MaClasse
{
public MaClasse SousObjet { get; set; }
private object[] _tailleDeBase;
public MaClasse()
{
_tailleDeBase= new object[1000000];
}
}
|