2009-11-19 3 views
1

Je suis conscient que .NET n'utilise pas la mémoire physique complète disponible. J'ai rencontré une exception System.OutOfMemoryException alors que l'utilisation de la mémoire physique n'était que de 79%. J'ai exécuté mon système jusqu'à 92% d'utilisation de mémoire physique.Comment puis-je dire à .NET combien de mémoire il devrait utiliser? et combien de mémoire devrait-il allouer à un processus?

Vous pouvez voir capture d'écran ici: http://a.imagehost.org/0655/CaptureOOM.gif alt text http://a.imagehost.org/0655/CaptureOOM.gif

Comment puis-je dire .NET à utiliser plus de mémoire?

Je veux également savoir, est cette exception en raison de .NET a la mémoire insuffisante ou. NET a de la mémoire, mais pas pour cette application?

+0

Pourriez-vous poster le contenu (ou la section applicable) de la méthode Laws.Apply (Bitmap)? – overslacked

Répondre

0

Il n'est vraiment pas une option pour modifier ceci est contrôlé par l'environnement .NET et possède sa propre Garbage Collection pour gérer la gestion de la mémoire.

Si vous avez des objets que vous souhaitez finaliser et d'en disposer, vous pouvez forcer un GC avec

GC.Collect(); GC.WaitForPendingFinalizers();

Quelques notes

l'objet dans Allouées une autre méthode que la méthode principale. En effet, si l'objet alloué dans la méthode Main appelait alors GC.Collect dans la même méthode, l'objet serait techniquement toujours associé au code en cours d'exécution et ne serait donc pas éligible à la collecte.

La méthode GC.Collect est conçue pour ne pas contrôler la destruction d'objets spécifiques, mais pour autoriser le forçage de la collection pour tous les objets inutilisés. Par conséquent, c'est une opération très coûteuse et ne devrait être utilisée que dans les cas où vous voulez/devez forcer la collecte globale. Pour les situations où vous souhaitez forcer la finalisation d'un objet spécifique, vous devez implémenter le pattern Dispose.

Espérons que cela aide.

2

OutOfMemoryException n'a rien à voir avec la mémoire physique. C'est parce que vous n'aviez pas assez de bloc de mémoire virtuelle contiguë. Parfois, .NET lancera même une exception OutOfMemoryException si vous avez manqué de descripteurs de fichiers ou d'une autre ressource limitée.

0

Exécutez-vous ceci dans une machine virtuelle? L'espace mémoire virtuel est-il suffisant? Quelle est la taille de l'allocation que vous essayez d'accomplir?

Vous avez vraiment besoin de faire plus de débogage forensique pour comprendre exactement ce qui échoue et les paramètres de la fonction.

Questions connexes