48 votes

Quelles sont les causes de la fragmentation de la mémoire dans .NET

Je suis à l'aide de Portes Rouges FOURMIS memory profiler pour déboguer une fuite de mémoire. Il garde me signalant que:

La Fragmentation de la mémoire peut être à l'origine .NET pour réserver trop de mémoire libre.

ou

La Fragmentation de la mémoire affecte la taille de l'objet le plus grand qui peut être alloué

Parce que j'ai des TOC, ce problème doit être résolu.

Quels sont certains de codage standard de pratiques qui aident à éviter la fragmentation de la mémoire. Vous pouvez défragmenter par certains .NET méthodes? Serait-il même de l'aide?

10voto

Daniel Earwicker Points 63298

Le segment GC traite différemment les allocations d'objets volumineux. Il ne les compresse pas, mais combine simplement des blocs libres adjacents (comme un magasin de mémoire non géré traditionnel).

Plus d'informations ici: http://msdn.microsoft.com/en-us/magazine/cc534993.aspx

La meilleure stratégie pour les très grands objets consiste donc à les allouer une fois, puis à les conserver et à les réutiliser.

9voto

John Leidegren Points 21951

Vous savez, j'ai un peu de doute le profileur de mémoire ici. La gestion de la mémoire système .NET réellement essaie de défragmenter le tas pour vous en se déplaçant autour de la mémoire (c'est pourquoi vous avez besoin à la broche de la mémoire doit être partagé avec une DLL externe).

Grand allocations de mémoire pris sur de longues périodes de temps est sujette à une plus grande fragmentation. Alors que les petites éphémères (court) des demandes de mémoire sont peu susceptibles de causer la fragmentation .NET.

Voici aussi quelque chose de la peine d'y penser. Avec le courant GC de .NET, la mémoire allouée proche dans le temps, généralement étroitement rapprochées dans l'espace. Qui est à l'opposé de la fragmentation. c'est à dire que Vous devez allouer de la mémoire de la façon dont vous souhaitez accéder.

Est-il seulement le code managé ou faut-il contient des trucs comme P/Invoke, une mémoire non managée (Maréchal.AllocHGlobal) ou des trucs comme GCHandle.Alloc(obj, GCHandleType.Épinglé)?

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