95 votes

Exception de mémoire insuffisante .NET: 1,3 Go utilisé mais 16 Go installés

Je suis un souvenir d'exception dans mon application c# lors de l'utilisation de la mémoire pour l'application va sur environ 1,3 GO.

J'ai eu ce même problème sur une machine 32 bits avec 3 go de mémoire et qu'il avait un sens à l'époque, mais maintenant, j'ai mis à jour le matériel à un ordinateur 64 bits avec 16 go de mémoire avec le haut de gamme de carte mère et de RAM, mais le manque De Mémoire exception se produit toujours après 1,3 GO!

Je sais qu'il y a pas un seul des objets de plus de 2 GO et 1.3 est moins de 2 GO de toute façon, la MS limite de 2 go sur un seul objet n'est pas susceptible d'être le problème...

Il semble qu'il y est un windows kill-switch, de la sorte, lorsqu'une application atteint une certaine utilisation de la mémoire le seuil... Puis il devrait y avoir un moyen de le configurer c'est dans le registre peut-être?

Toute aide sera grandement appréciée!

92voto

Tigran Points 41381

Il n'y a aucune différence jusqu'à ce que vous compilez à même l'architecture cible. Je suppose que vous compilez pour 32 architecture bits dans les deux cas.

La peine de mentionner que OutOfMemoryException peut être soulevé aussi si vous obtenez 2GB de la mémoire allouée par une collection unique dans le CLR (disons List<T>) sur les deux architectures 32 et 64 bits.

Pour être en mesure de bénéficier de mémoire possible le potentiel de bonté sur 64 architecture bits, vous devez compiler votre code de ciblage 64 architecture bits. Après cela, naturellement, votre binaire sera exécuté uniquement sur 64 peu, mais bénéficieront de la possibilité d'avoir plus d'espace disponible dans la mémoire RAM.

65voto

Desty Points 919

Comme déjà mentionné, la compilation de l'application en x64 vous donne beaucoup plus de mémoire disponible.

Mais dans le cas où l'on doit construire une application en x86, il y a un moyen pour augmenter la limite de mémoire à partir de 1,2 GO à 4 go (qui est la limite réelle pour la version 32 bits de processus):

Dans le VC/bin de l'installation de Visual Studio répertoire, il doit y avoir un editbin.exe le fichier. Donc, à mon installation par défaut je trouve, en vertu de

C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\editbin.exe

Afin de faire fonctionner le programme, peut-être que vous devez exécuter vcvars32.bat dans le même répertoire. Puis un

editbin /LARGEADDRESSAWARE <your compiled exe file>

suffit de laisser votre programme d'utilisation de 4 go de RAM. <your compiled exe file> est le fichier exe, qui VS générés lors de la compilation de votre projet.

Si vous souhaitez automatiser ce problème à chaque fois que vous compilez votre projet, utilisez le Post suivant-créer un événement pour l'exécution du projet:

if exist "$(DevEnvDir)..\tools\vsvars32.bat" (
   call "$(DevEnvDir)..\tools\vsvars32.bat"
   editbin /largeaddressaware "$(TargetPath)"
)

Note: La même chose peut être fait avec l' devenv.exe de laisser Visual Studio également utiliser 4 go de RAM au lieu de 1,2 GO (mais d'abord de sauvegarde du vieux - devenv.exe).

2voto

fge Points 40850

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;)

1voto

Jacco Points 2512

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X