我可以在 PS v3.0 中看到该问题,但在 PS v2.0 中看不到。这是我用来的代码
请参阅此(所有示例均在 PowerShell 中):
for() {
$runspace = [runspacefactory]::CreateRunspace()
$runspace.Open()
$runspace.Close()
$p = Get-Process -Id $PID
'{0} {1}' -f $p.Handles, ($p.PrivateMemorySize / 1mb)
}
上面代码中的 v3.0 看起来句柄和内存正在泄漏。
至于 v2.0 没有这个问题,一种可能的解决方法可能是
使用 PS v2.0 启动服务,即PowerShell.exe -Version 2.0
.
如果这是不可能的,我可以想出另外两种解决方法。其中之一不是
直接创建运行空间但使用[powershell]
反而。例如,这个
代码在 v3.0 中没有显示泄漏:
for() {
$ps = [powershell]::Create()
$p = $ps.AddCommand('Get-Process').AddParameter('Id', $PID).Invoke()
'{0} {1}' -f $p.Handles, ($p.PrivateMemorySize / 1mb)
$ps.Dispose()
}
另一种解决方法(如果适用)可以是使用[runspacefactory]::CreateRunspacePool()
。这种方式也不会显示
泄露:
$rs = [runspacefactory]::CreateRunspacePool()
$rs.Open()
for() {
$ps = [powershell]::Create()
$ps.RunspacePool = $rs
$p = $ps.AddCommand('Get-Process').AddParameter('Id', $PID).Invoke()
'{0} {1}' -f $p.Handles, ($p.PrivateMemorySize / 1mb)
$ps.Dispose()
}
#$rs.Close() # just a reminder, it's not called here due to the infinite loop
最后一个也运行得更快,因为运行空间被重用了。