Je reçois une exception de mémoire insuffisante dans mon application c # lorsque l'utilisation de la mémoire pour l'application dépasse environ 1,3 Go.
J'ai eu ce même problème sur une machine 32 bits avec 3 Go de mémoire et c'était logique à l'époque, mais maintenant j'ai mis à niveau le matériel sur une machine 64 bits avec 16 Go de mémoire avec la carte mère haut de gamme et RAM mais l'exception de mémoire insuffisante survient toujours après 1,3 Go!
Je sais qu'il n'y a pas d'objet unique supérieur à 2 Go et que 1,3 correspond à moins de 2 Go de toute façon, donc la limite MS 2 Go intégrée à un seul objet ne devrait pas être le problème ...
Il semble qu'il y ait un kill kill de Windows lorsqu'une application atteint un certain seuil d'utilisation de la mémoire ... Alors, il devrait y avoir un moyen de configurer cela dans le registre peut-être?
Toute aide sera fortement appréciée!
Il n'y a aucune différence jusqu'à ce que vous compiliez à la même architecture cible. Je suppose que vous compilez pour 32
architecture de bits dans les deux cas.
Il est à noter que OutOfMemoryException
peut également être généré si vous obtenez 2GB
de la mémoire allouée par une seule collection dans CLR (dites List<T>
) sur les deux architectures 32
et 64
peu.
Pour pouvoir bénéficier de la bonté de la mémoire sur 64
architecture binaire, vous devez compiler votre code de ciblage 64
architecture de bits. Après cela, naturellement, votre binaire ne fonctionnera que sur 64
_ bit, mais bénéficiera de la possibilité d'avoir plus d'espace disponible dans la RAM.
Comme déjà mentionné, compiler l'application en x64 vous donne beaucoup plus de mémoire disponible.
Mais dans le cas où il faut créer une application en x86, il existe un moyen de relever la limite de mémoire de 1,2 Go à 4 Go (ce qui correspond à la limite réelle pour les processus 32 bits):
Dans le dossier VC/bin du répertoire d'installation de Visual Studio, il doit y avoir un fichier editbin.exe
fichier. Donc, dans mon installation par défaut, je le trouve sous
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\editbin.exe
Pour que le programme fonctionne, vous devez peut-être exécuter vcvars32.bat
dans le même répertoire en premier. Puis un
editbin /LARGEADDRESSAWARE <your compiled exe file>
est suffisant pour laisser votre programme utiliser 4 Go de RAM. <your compiled exe file>
est l'exécutable généré par le VS lors de la compilation de votre projet.
Si vous souhaitez automatiser ce comportement à chaque fois que vous compilez votre projet, utilisez l'événement Post-Build suivant pour le projet exécuté:
if exist "$(DevEnvDir)..\tools\vsvars32.bat" (
call "$(DevEnvDir)..\tools\vsvars32.bat"
editbin /largeaddressaware "$(TargetPath)"
)
Note de bas de page: On peut faire la même chose avec le devenv.exe
laisser Visual Studio utiliser également 4 Go RAM au lieu de 1,2 Go (mais commencez par sauvegarder l'ancien devenv.exe
).
Il est à noter que la valeur par défaut pour une compilation 'N'importe quel processeur' coche maintenant la case à cocher 'Préférer 32 bits'. Étant défini sur AnyCPU, sur un système d’exploitation 64 bits avec 16 Go de RAM), il est toujours possible de rencontrer une exception de mémoire insuffisante à 2 Go si cette case est cochée.
Il semble que vous ayez un archet de 64 bits, très bien, mais une version 32 bits du runtime .NET et/ou une version 32 bits de Windows.
Et en tant que tel, l'espace d'adressage disponible pour votre processus est toujours le même, il n'a pas changé depuis votre configuration précédente.
Mise à niveau vers un système d'exploitation 64 bits et une version .NET 64 bits;)
Votre application est-elle exécutée en tant que processus 64 ou 32 bits? Vous pouvez vérifier cela dans le gestionnaire de tâches.
Cela pourrait être, il fonctionne en tant que 32 bits, même si tout le système fonctionne en 64 bits.
Si 32 bits, une bibliothèque tierce pourrait être la cause. Mais assurez-vous d’abord que votre application compile pour "Any CPU", comme indiqué dans les commentaires.
Cette méthode ne fonctionne pas sans les paramètres suivants.
- Exécuter l'invite cmd.exe (important: Exécuter en tant qu'administrateur)
- tapez bcdedit.exe et exécutez
- Regardez les paramètres "augmentez le service" et il n'y a pas alors écrivez la déclaration suivante
- bcdedit/set augmenteuserva 3072
- et encore l'étape 2 et vérifiez les paramètres
Nous avons ajouté ces paramètres et ce bloc a commencé.
if exist "$(DevEnvDir)..\tools\vsvars32.bat" (
call "$(DevEnvDir)..\tools\vsvars32.bat"
editbin /largeaddressaware "$(TargetPath)"
)