Système.Moment de l'exécution.InteropServices.COMException (0x80070008): Pas assez de mémoire disponible pour traiter cette commande
Je suis en train de diagnostiquer cette exception :
System.Runtime.InteropServices.COMException (0x80070008): Not enough storage is available to process this command. (Exception from HRESULT: 0x80070008)
at System.Runtime.Remoting.RemotingServices.AllocateUninitializedObject(RuntimeType objectType)
at System.Runtime.Remoting.RemotingServices.AllocateUninitializedObject(Type objectType)
at System.Runtime.Remoting.Activation.ActivationServices.CreateInstance(Type serverType)
at System.Runtime.Remoting.Activation.ActivationServices.IsCurrentContextOK(Type serverType, Object[] props, Boolean bNewObj)
at Oracle.DataAccess.Client.CThreadPool..ctor()
at Oracle.DataAccess.Client.OracleCommand.set_CommandTimeout(Int32 value)
...
Il ne ressemble pas à l'un quelconque des types normaux de "stockage" ont touché toutes les limites. La demande est à l'aide d'environ 400 mo de mémoire, 70 threads, 2000 poignées et le disque dur a beaucoup de GO de libre. La machine est en cours d'exécution Windows 2003 Enterprise Server 32 bits avec 16 go de RAM ainsi, la mémoire ne devrait pas être un problème.
L'application est en cours d'exécution en tant que service windows, donc il n'y a pas d'objets GDI utilisé. Cours de GDI poignées est une cause fréquente de cette exception.
Connexions de base de données, commandes & les lecteurs sont tous enveloppés avec l'utilisation de blocs de sorte qu'ils devraient être nettoyée correctement.
Mise à JOUR: Réduire le nombre de threads, nous avons été à l'aide de 12 à 4 semble avoir résolu le problème. Nous avons réussi à exécuter sans erreur pendant plus de 24 heures, avant de nous ont été d'une durée comprise entre 4 et 8 heures.
UPDATE2: je n'ai jamais compris comment les ressources nous ont été en cours d'exécution hors de, mais la réduction du nombre de threads semble avoir résolu le problème. Ou au moins caché.
Shot in the dark (seeying interop) êtes-vous d'appeler le Maréchal.ReleaseComObject?
L'interopérabilité est fait par l'Oracle.
Alors pourquoi ne vous ai 16 go de RAM?
16 GO de RAM physique peut être consulté par les 32 Bits de Windows Server 2003 par le PAE. PAE n'affecte pas la quantité de mémoire virtuelle qui peut être accessible par une application. Voir le commutateur /3GB et d'adressage étendu "au Courant" des mots-clés pour augmenter la mémoire virtuelle à 3 GO.
OriginalL'auteur Darryl Braaten | 2010-03-12
Vous devez vous connecter pour publier un commentaire.
Un autre facteur que vous devez considérer est la fragmentation de la mémoire.
Le maximum d'allocation unique vous pouvez effectuer est égal au plus grand bloc contigu de mémoire disponible pour le processus. C'est presque toujours inférieure à la quantité totale de mémoire disponible dans le processus en raison de la fragmentation. Qui est alloué à des blocs de mémoire assis entre 2 blocs de mémoire "fragments" de l'espace.
Plus la fragmentation que vous avez dans le processus le plus petit, le plus grand bloc contigu de mémoire qui sera disponible. J'ai vu des situations où il était proche de 1 go de mémoire libre, mais le plus grand bloc contigu était d'environ 10 MO.
Avez-vous vérifié pour la fragmentation de la mémoire dans ce processus?
La Fragmentation ne semble pas être un problème, le plus grand bloc disponible était de 500 mo alors que la demande a été éprouve de la difficulté. Cela a été recueillie à l'aide de la sysinternals vmMap outil.
OriginalL'auteur JaredPar
Vous n'avez éliminer toutes les sources évidentes de cette erreur pour votre processus. Il est probable que c'est effectivement un problème de système d'exploitation. La ressource est toujours sous pression sur un serveur, c'est la mémoire du noyau de la piscine. Il est facile de voir, TaskMgr.exe l'affiche sur l'onglet Performances.
Un peu les matches de votre pile d'appel, ressemble le fournisseur Oracle est la création de threads pour un pool de threads. Un thread a un mégaoctet dans votre processus de et 24 KB dans le noyau de la mémoire de la piscine, utilisé comme une pile quand le fil des commutateurs de mode noyau.
Informations de fond est disponible ici.
Eh bien, le temps de donner à Oracle un appel.
OriginalL'auteur Hans Passant
Ressemble à quelque chose, les boucles et l'instanciation de trop d'objets sur le tas si vous êtes à court de mémoire sur le tas. Recherchez toutes les boucles dans le code appelant.
OriginalL'auteur Richard Hein