【发布时间】:2011-08-21 19:47:16
【问题描述】:
我发现了我的组枚举代码的泄漏。我写了一个测试例程,我试图处理所有东西,但它仍然泄漏。
有人看到我做错了吗?在我的测试中,我连续调用了 100 次,在我的小域中,内存占用从 32MB 到超过 150MB。
private void EnumGroups()
{
try
{
using (PrincipalContext context = new PrincipalContext(ContextType.Domain, "domainname.com"))
{
using (PrincipalSearcher srch = new PrincipalSearcher())
{
srch.QueryFilter = new UserPrincipal(context);
// do the search
using (PrincipalSearchResult<Principal> results = srch.FindAll())
{
// enumerate over results
foreach (UserPrincipal up in results)
{
using (PrincipalSearchResult<Principal> groups = up.GetGroups())
{
foreach (GroupPrincipal gp in groups)
gp.Dispose();
}
up.Dispose();
}
}
}
}
}
catch (Exception exc)
{
Trace.WriteLine(exc);
}
}
【问题讨论】:
-
“内存足迹”是一个非常模糊的术语。你是如何衡量这个的?
-
您确定这是内存泄漏,而不仅仅是内存的正常使用?如果该过程完成并且您不再执行此操作,那么内存使用量是否会及时下降?
-
当您调用
.Dispose();时,这不会将对象从内存中撤出,因此它仍然会占用空间。 Garbage Collector 需要运行以清理内存,它基本上在需要时运行。您可以尝试强制 GC 运行,但这通常被认为是不好的做法(请参阅 stackoverflow.com/questions/233596/…) -
我正在任务管理器中查看“工作集(内存)”。在例程末尾添加 GC.Collect 似乎没有什么区别。在我的测试中,我调用了 100 次例程,在循环结束且程序空闲后,占用空间大约为 98MB。
-
原因,我注意到这一切都是因为我的一个测试版网站的内存占用为 1.3 GB,而服务永远不会达到 100MB。
标签: c# .net-3.5 active-directory group-membership