我創建了一個循環大量XML Schema(.xsd)文件的PowerShell腳本,併爲每個文件創建一個.NET XmlSchemaSet
對象,並調用Add()
和Compile()
向其添加架構,並打印出所有驗證錯誤。如何指示PowerShell垃圾收集.NET對象,如XmlSchemaSet?
此腳本可正常工作,但某處存在內存泄漏,導致它在數百個文件上運行時會消耗千兆字節的內存。
我基本上是做一個循環如下:
$schemaSet = new-object -typename System.Xml.Schema.XmlSchemaSet
register-objectevent $schemaSet ValidationEventHandler -Action {
...write-host the event details...
}
$reader = [System.Xml.XmlReader]::Create($schemaFileName)
[void] $schemaSet.Add($null_for_dotnet_string, $reader)
$reader.Close()
$schemaSet.Compile()
(一個完整的腳本重現此問題可以在這個要點中找到:https://gist.github.com/3002649只要運行它,看在內存使用率增加任務管理器或Process Explorer)
一些博客文章的啓發,我嘗試添加
remove-variable reader, schemaSet
我也試着拿起$schema
來回米Add()
和做
[void] $schemaSet.RemoveRecursive($schema)
這似乎有一定的效果,但仍然有泄漏。我假設XmlSchemaSet
的較舊實例仍在使用內存而未被垃圾收集。
問題:我該如何正確教導垃圾回收器它可以回收上面代碼中使用的所有內存?或者更一般地說:我怎樣才能用有限的內存來實現我的目標?
這確實使得增加更少,所以這可能有助於實踐;但使用的內存量仍在逐漸增加。 –
在關閉它後添加'$ reader.Dispose()'有助於更多? –
正如[另一個StackOverflow答案](http://stackoverflow.com/a/745965/223837)中所述,這在PowerShell中不是直接可能的,並且它不是必需的,因爲Close()意味着Dispose()按照推薦的Microsoft慣例。 –