« Limitation Mémoire par processus » : différence entre les versions
Aucun résumé des modifications |
Aucun résumé des modifications |
||
(4 versions intermédiaires par le même utilisateur non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
=OS 32-bits et application 32-bits= | [[Category:Windows]] | ||
[[Category:CSharp]] | |||
= Liens = | |||
* [http://bilbrobloggins.com/wow64/hidden-secrets-of-w0w64-ndash-large-address-space Hidden secrets of W0W64 – Large Address Aware] | |||
* [http://msdn.microsoft.com/en-us/library/windows/desktop/aa366778%28v=vs.85%29.aspx Memory and Address Space Limits] | |||
= 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).<br/> | Les processus 32-bits peuvent utiliser au maximum 4Gio de RAM (2^32 = 4 294 967 296 o).<br/> | ||
Mais l'application en elle-même ne pourra en utiliser que 2Gio car le noyau Windows s'en réserve 2Gio.<br/> | Mais l'application en elle-même ne pourra en utiliser que 2Gio car le noyau Windows s'en réserve 2Gio.<br/> | ||
L'option « LARGEADDRESSAWARE » permet d'étendre la mémoire utilisable par l'application à 3Gio. | L'option « LARGEADDRESSAWARE » permet d'étendre la mémoire utilisable par l'application à 3Gio. | ||
=OS 64-bits= | = OS 64-bits = | ||
==Application 32-bits== | == Application 32-bits == | ||
Là encore l'application 32-bits ne peut utiliser que 2Gio.<br/> | Là encore l'application 32-bits ne peut utiliser que 2Gio.<br/> | ||
L'option « LARGEADDRESSAWARE » permet d'étendre la mémoire utilisable par l'application à 4Gio. | L'option « LARGEADDRESSAWARE » permet d'étendre la mémoire utilisable par l'application à 4Gio. | ||
==Application 64-bits== | == Application 64-bits == | ||
L'application 64-bits peut utiliser jusqu'à 8Tio.<br/> | L'application 64-bits peut utiliser jusqu'à 8Tio.<br/> | ||
L'option « LARGEADDRESSAWARE » est activé par défaut sur les les applications 64-bits. | L'option « LARGEADDRESSAWARE » est activé par défaut sur les les applications 64-bits. | ||
=LARGEADDRESSAWARE= | = LARGEADDRESSAWARE = | ||
L'option « LARGEADDRESSAWARE » indique à l'éditeur de liens que l'application peut gérer des adresses supérieures à 2 gigaoctets. | L'option « LARGEADDRESSAWARE » indique à l'éditeur de liens que l'application peut gérer des adresses supérieures à 2 gigaoctets. | ||
==Test== | == Test == | ||
<kode lang='dos'> | |||
< | |||
dumpbin /HEADERS MonApplication.exe | dumpbin /HEADERS MonApplication.exe | ||
REM si le flag LARGEADDRESSAWARE est activé le résultat doit contenir | REM si le flag LARGEADDRESSAWARE est activé le résultat doit contenir | ||
Ligne 26 : | Ligne 29 : | ||
REM C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\dumpbin.exe | REM C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\dumpbin.exe | ||
</ | </kode> | ||
==Modification== | == Modification == | ||
<kode lang='dos'> | |||
< | |||
editbin /LARGEADDRESSAWARE MonApplication.exe | editbin /LARGEADDRESSAWARE MonApplication.exe | ||
REM suppression du flag | REM suppression du flag | ||
editbin /LARGEADDRESSAWARE:NO MonApplication.exe | editbin /LARGEADDRESSAWARE:NO MonApplication.exe | ||
REM C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\editbin.exe | REM C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\editbin.exe | ||
</ | </kode> | ||
=Test de saturation de la mémoire en C#= | = Test de saturation de la mémoire en C# = | ||
<kode lang='cs'> | |||
< | |||
var maListe = new List<object>(); | var maListe = new List<object>(); | ||
while (true) | while (true) | ||
Ligne 58 : | Ligne 52 : | ||
// Le contenu de maListe est donc recopié, ce qui provoque une demande d'allocation mémoire de la taille de maListe. | // 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. | // 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. | ||
</ | </kode> | ||
On utilise ici on arborescence d'objets, à chaque pas on ajoute la taille d'un nouvel objet jusqu'à saturation de la mémoire. | On utilise ici on arborescence d'objets, à chaque pas on ajoute la taille d'un nouvel objet jusqu'à saturation de la mémoire. | ||
<kode lang='cs'> | |||
< | |||
public class Program | public class Program | ||
{ | { | ||
Ligne 96 : | Ligne 86 : | ||
} | } | ||
} | } | ||
</ | </kode> | ||
Dernière version du 5 avril 2020 à 23:28
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]; } } |