使用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文件運行時將大量數據存儲在一個變量中,似乎將數據緩存在內存中,即使該變量不直接可用(除非聲明範圍或點源)完成運行。我不認爲你所看到的是真正的內存泄漏。這是正常的。」 –