PowerShell实现动态获取当前脚本运行时消耗的内存
想粗略地理解一个脚本消耗了多少内存,或着在你往PowerShell中的变量存结果时,消耗了多少内存,可以借助于下面的函数:
#requires-Version2
$script:last_memory_usage_byte=0
functionGet-MemoryUsage
{
$memusagebyte=[System.GC]::GetTotalMemory('forcefullcollection')
$memusageMB=$memusagebyte/1MB
$diffbytes=$memusagebyte-$script:last_memory_usage_byte
$difftext=''
$sign=''
if($script:last_memory_usage_byte-ne0)
{
if($diffbytes-ge0)
{
$sign='+'
}
$difftext=",$sign$diffbytes"
}
Write-Host-Object('Memoryusage:{0:n1}MB({1:n0}Bytes{2})'-f$memusageMB,$memusagebyte,$difftext)
#savelastvalueinscriptglobalvariable
$script:last_memory_usage_byte=$memusagebyte
}
你可以在任何时候运行Get-MemoryUsage,它会返回当前脚本最后一次调用后消耗的内存,同时和你上一次调用Get-MemoryUsage运行结果的进行对比,并显示内存的增量。
这里的关键点是使用了GC,它在.NETFramwwork中负责垃圾回收,通常不会立即释放内存,想要粗略地计算内存消耗,垃圾回收器需要被指定释放未被使用的内存[gc]::Collect(),然后再统计分配的内存。
为了更好的演示上面的函数我们来看一个调用的例子:
PS>Get-MemoryUsage Memoryusage:6.7MB(6,990,328Bytes) PS>$array=1..100000 PS>Get-MemoryUsage Memoryusage:10.2MB(10,700,064Bytes,+3709736) PS>Remove-Variable-Namearray PS>Get-MemoryUsage Memoryusage:7.4MB(7,792,424Bytes,-2907640)