pwsh/dev/functions/showMemoryUsage.ps1 (51 lines of code) (raw):
function showMemoryUsage {
function makeDouble {
[CmdletBinding()]
Param
(
[Parameter(Mandatory = $true)]$MemoryUsed
)
try {
$memoryUsedDouble = [double]($memoryUsed -replace ',', '.')
}
catch {
$memoryUsedDouble = [string]$MemoryUsed
}
return $memoryUsedDouble
}
function getMemoryUsage {
if ($IsLinux) {
$memoryUsed = 100 - (free | grep Mem | awk '{print $4/$2 * 100.0}')
makeDouble $memoryUsed
}
if ($IsWindows) {
$memoryUsed = (Get-CimInstance win32_operatingsystem | ForEach-Object { '{0:N2}' -f ((($_.TotalVisibleMemorySize - $_.FreePhysicalMemory) * 100) / $_.TotalVisibleMemorySize) })
makeDouble $memoryUsed
}
}
$memoryUsed = getMemoryUsage
if ($memoryUsed -is [double]) {
if ($memoryUsed -gt $CriticalMemoryUsage) {
Write-Host "System memory utilization HIGH: $([math]::Round($memoryUsed))%" -ForegroundColor Magenta
Write-Host 'Init garbage collection (GC)'
$PSMemoryBefore = [System.GC]::GetTotalMemory($false)
Write-Host " PS memory used before GC: $($PSMemoryBefore /1MB)MB ($PSMemoryBefore)"
$startGC = Get-Date
$PSMemoryAfter = [System.GC]::GetTotalMemory($true)
$endGC = Get-Date
$PSMemoryDiff = $PSMemoryBefore - $PSMemoryAfter
Write-Host " PS memory used after GC: $($PSMemoryAfter /1MB)MB ($PSMemoryAfter)"
Write-Host " GC cleared $($PSMemoryDiff /1MB)MB ($PSMemoryDiff)" -ForegroundColor Green
Write-Host " GC duration: $((New-TimeSpan -Start $startGC -End $endGC).TotalSeconds) seconds"
Write-Host " System memory utilization after GC: $(getMemoryUsage)%"
}
else {
if ($ShowMemoryUsage) {
Write-Host "System memory utilization: $([math]::Round($memoryUsed))%"
}
}
}
else {
Write-Host "System memory utilization: $($memoryUsed)% (not double)"
}
}