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)