Dans une question précédente, j'ai demandé possible programatic ways of maximising the largest block allocatable on the LOH. Je vois toujours les problèmes, mais maintenant j'essaie de comprendre pourquoi le LOH semble grandir et diminuer en taille, mais je vois toujours des exceptions OutOfMemory qui correspondent à ce que d'autres ont rapporté comme étant dû à la fragmentation LOH . Pourquoi peut-on appeler, par exemple, StringBuilder.EnsureCapacity pour me renvoyer une exception OutOfMemoryException, mais un autre appel venant d'ailleurs entraînerait une augmentation de la taille de LOH (selon les compteurs de performance, il augmente et diminue)?Pourquoi le tas d'objets volumineux peut-il se développer plutôt que d'émettre une exception?
1
A
Répondre
2
je ne suis pas sûr mais je voudrais essayer de 2 façons:
- chèque de mémoire non géré alloué dans votre application et utilisez la méthode GC.AddMemoryPressure pour dire la memorymanagment de gérer cela mieux.
- utilisez la classe MemoryFailPoint avant vos appels d'allocation importants. là vous avez une chance d'éviter un grand boom dans votre application. libérez des ressources et réessayez.
éditer: une 3ème manière peut-être de créer plus d'appdomains et de manipuler ce gros truc dans ces appdomains supplémentaires.
0
Je suis allé à l'article original et posté ce que je pense que pourrait être votre problème là-bas. Allez le vérifier.