Fuite de mémoire lors de l'utilisation de DirectorySearcher.FindAll()

J'ai un long processus en cours d'exécution qui doit faire beaucoup de requêtes sur Active Directory assez souvent. Pour cet effet, j'ai été en utilisant le Système.DirectoryServices espace de noms, à l'aide de la DirectorySearcher et DirectoryEntry classes. J'ai remarqué une fuite de mémoire dans l'application.

Il peut être reproduite avec ce code:

while (true)
{
    using (var de = new DirectoryEntry("LDAP://hostname", "user", "pass"))
    {
        using (var mySearcher = new DirectorySearcher(de))
        {
            mySearcher.Filter = "(objectClass=domain)";
            using (SearchResultCollection src = mySearcher.FindAll())
            {
            }            
         }
    }
}

La documentation de ces classes-dire qu'ils auront une fuite de mémoire si dispose() n'est pas appelée. J'ai essayé sans disposer du bien, c'est juste des fuites plus de la mémoire dans ce cas. J'ai testé avec les deux versions framework 2.0 et 4.0 quelqu'un A rencontré ce avant? Existe-il des solutions?

Mise à jour: j'ai essayé d'exécuter le code dans un autre domaine d'application, et il ne semble pas aider non plus.

  • while(true)... ?
  • C'est juste pour illustrer le problème, dans le réel de l'application, il n'est pas comme ça, évidemment.
  • Comment pouvez-vous remarqué une fuite de mémoire dans l'application"?
  • Malheureusement, en utilisant while(true)... à cet endroit permettrait de prévenir la DirectorySearcher et la DirectoryEntry être éliminés correctement. Vous pourriez le mettre au premier niveau de "l'aide" à la place, et de vérifier ce qui se passe.
  • en fait, j'ai essayé que le premier, avec les mêmes résultats. Il donne le même résultat dans les deux cas. Édité mon code en question et si déplacé à l'extérieur de la boucle.
  • Gencer - avez-vous essayé d'inspecter l'utilisation de la mémoire avec WinDebug et les extensions gérées? J'ai réussi à troubleshooted des fuites de mémoire de l'utiliser.
  • J'ai utilisé WinDbg et aussi Ants profiler, et le problème semble être dans la mémoire non managée partie, qui ne cesse de croître.
  • Gencer - vous dire "dans le réel de l'application, il n'est pas comme ça, évidemment". Ce qui pourrait ne pas être si évident, c'est que nous ne pouvons pas vraiment d'indices, à moins que nous savons ce que votre code réel, c'est comme.
  • dans mon précédent code de la boucle while a été autour de la findall(), qui n'est pas un scénario réaliste. Le point du code ci-dessus est pour illustrer la fuite de mémoire, ce qui semble se produire chaque fois que FindAll() est appelée. Il n'est pas destiné à un morceau de l'application réelle.
  • Gencer de nouveau... sans voir le code réel, tout ce que nous faisons c'est de faire des suppositions sauvages dans l'obscurité.
  • Qui est le véritable code de la fuite de la mémoire. Vous pouvez l'exécuter, et il sera de fuite.. Si je peux éviter le code ci-dessus à partir de la fuite, alors je peux l'utiliser dans mon code, qui a beaucoup de code supplémentaire de ne pas pertinent pour cette question, c'est pourquoi j'ai sauté dessus.
  • lequel de ces objets est une fuite? Avez-vous trouver de l'aide SOS.dll f.e.?
  • Ants profiler montre "une mémoire non managée" que la partie qui est en augmentation. Il n'est pas directement quelque chose à l'intérieur de la GC de l'atteindre..
  • Je me souviens que j'ai frappé ce problème dans le .net 2 jours, vous pourriez être mieux d'utiliser le LDAP classes de parler à ActiveDirectory, plutôt que de la vieille ADSI gâchis!!!
  • Ringrose, qui LDAP classes parlez-vous?

InformationsquelleAutor Can Gencer | 2011-04-12