2010-05-30 3 views
0

Mon application continue de fonctionner pendant 4 à 6 heures. Pendant ce temps, il n'y a pas d'augmentation continante de la mémoire ou quoi que ce soit de similaire.Une autre question de fuite de mémoire

Puis, après 4 à 6 heures, je commence à recevoir des exceptions EOutofMemory. Même à ce moment-là, il n'y a que 900 Mo sur 3 Go de RAM, selon le gestionnaire de tâches. Et l'application elle-même n'utilise pas plus de 200 Mo.

Alors pourquoi je reçois une erreur EOoutofMEmory?

Cela signifie-t-il que la fuite de mémoire n'est pas nécessairement visible dans le gestionnaire de tâches?

Regards

+6

Langue? Plate-forme? –

+2

Gestionnaire de tâches impliquerait Windows, si l'enfer si je connais la langue. Les seules choses avec EOutOfMemoryError sont quelques fautes de frappe en ligne et Delphi. Compte tenu de l'orthographe de notre ami "Regards", je vais avec typo et parier Java. Voulez-vous commencer une piscine de paris? – jasonmp85

+0

Je parie sur C++. J'ai fait du travail médico-légal (hum, ses dernières questions concernent le constructeur C++). http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/FR/html/delphivclwin32/SysUtils_EOutOfMemory.html – nc3b

Répondre

0

Cela peut être dû à une fragmentation de la mémoire. Lorsque l'application s'exécute pendant longtemps, la mémoire peut être fragmentée, ce qui signifie qu'elle est remplie par de nombreux petits blocs alloués et espaces libres. Si vous souhaitez allouer un bloc de mémoire plus grand que le plus grand bloc libre, votre allocation échouera, même si la quantité totale d'espace libre laisse supposer qu'il y a suffisamment de mémoire pour que l'allocation réussisse.

Vous pouvez également vérifier si vous n'essayiez pas accidentellement d'allouer un énorme bloc de mémoire en un point.

Je vous suggère de vérifier la taille de l'allocation qui a échoué.

1

Utilisez l'Explorateur de processus au lieu du Gestionnaire des tâches pour examiner la consommation de mémoire de votre application.

  • Octets privés: est la quantité de mémoire utilisée par votre application. Ceci est également la valeur affichée par le Gestionnaire des tâches dans la colonne VM Size (sous XP)
  • Taille de la mémoire virtuelle: c'est la plus grande adresse actuellement utilisée par votre application. Cette valeur est limitée à 2 Go (pour une application 32 bits dans un système d'exploitation 32 bits).

La différence entre les octets privés et la taille de la mémoire virtuelle est due à la fragmentation de la mémoire. La seule chose que vous pouvez faire à ce sujet est d'utiliser un gestionnaire de mémoire qui essaie de réduire la fragmentation, par ex. en utilisant des pools de mémoire.

Le gestionnaire de mémoire DougLea est une alternative gratuite. Il y a aussi le gestionnaire de mémoire commerciale. Vous pouvez aussi essayer d'écrire votre propre gestionnaire de mémoire (ce n'est pas si difficile: il vous suffit de remplacer les opérateurs nouveaux et supprimés).

Il existe également des astuces pour augmenter la limite de 2 Go. Si vous liez votre application avec le flag/LARGEADDRESSAWARE, votre application pourra allouer 3GB de mémoire (si XP est démarré avec le flag/3GB, pour Vista/W7 il y a probablement un flag similaire mais je ne le sais pas). Sur les systèmes d'exploitation 64 bits, un exécutable LargeAddressAware peut même utiliser jusqu'à 4 Go de mémoire.