2009-03-20 9 views
1

J'essaie de réduire la quantité de mémoire utilisée par mon application. Dans mon application, j'utilise System.Reflection.Emit.EnumBuilder pour créer des énumérations à la volée à partir des informations que je reçois à l'exécution. Je n'utilise qu'EnumBuilder pour créer une énumération individuelle, et après cela je n'ai plus besoin de l'utiliser. En utilisant CLRProfiler, j'ai remarqué que les EnumBuilders ne sont jamais détruits. Mon application peut faire des milliers d'énumérations en cours d'exécution, de sorte que la quantité de mémoire utilisée par ces EnumBuilders peut s'additionner. EnumBuilder ne définit pas de méthode Dispose, donc je ne peux pas le détruire de cette façon. Est-il possible de supprimer en quelque sorte les restes EnumBuilders de la mémoire?Détruire l'EnumBuilder après avoir créé une énumération?

Répondre

1

J'ai remarqué la même chose. C'est une 'fuite' dans ModuleBuilder qui s'accroche aux octets et aux chaînes IIRC.

Vous pouvez jeter un oeil dans WinDbg avec SOS chargé pour de meilleures informations de mémoire.

4

EnumBuilder crée l'énumération dans un assemblage dynamique. Selon How to: Load and Unload Assemblies (Guide de programmation C#), il est impossible de décharger un assembly sans décharger tous les domaines d'application qui l'utilisent. En particulier:

"Même si l'assemblage est hors de portée, le fichier d'assemblage réel restera chargé jusqu'à ce que tous les domaines d'application qui le contiennent soient déchargés."

2

Mon application peut faire des milliers de énumérations en cours d'exécution,

Pourquoi? On dirait que vous faites quelque chose que vous ne devriez probablement pas faire.

Questions connexes