使用Powershell v3,我使用.net库类System.DirectoryServices.DirectoryEntry
和System.DirectoryServices.DirectorySearcher
来查询域中用户的属性列表。这个代码基本上是found here。新对象是否有内存泄漏?
您需要添加的唯一东西是行和$ds.PropertiesToLoad.AddRange($properties)
之间的行$ds.PageSize=1000
。这将消除只抓取1000个用户的限制。
来自一个域的用户数(我们称之为domain1
)我已经有超过80,000个用户。另一个域名(我们称之为domain2
)拥有超过20万用户。
如果我在domain1
上运行代码,大约需要12分钟(与使用的24小时Get-QADUser
相比,这太棒了)。但是,脚本在PowerShell窗口中完成后,我注意到内存猪剩下约500MB。 Domain2
留下了大约1.5gb
的记忆猪。
注:与Get-QADUser
内存泄漏是非常非常更糟糕。 Domain2
留下了大约6GB的内存猪,大约需要72小时才能完成(而.NET类不到一个小时)。
释放内存的唯一方法是关闭PowerShell窗口。但是如果我想写一个脚本来调用所有这些域脚本来一个接一个地运行它们呢?到达第六个脚本后,我会耗尽内存。
我能想到的唯一的事情是New-Object
正在创建构造函数并且没有析构函数(与java不同)。我在循环迭代期间尝试使用[System.GC]::Collect()
,但这没有任何影响。
是否有原因?它是可解决的还是我坚持这个?
我手边没有答案,但我可以告诉你你看到的不是特定于“新对象”的。即使使用'Get-Content'在一个.ps1文件运行时将大量数据存储在一个变量中,似乎将数据缓存在内存中,即使该变量不直接可用(除非声明范围或点源)完成运行。我不认为你所看到的是真正的内存泄漏。这是正常的。” –