#Include <WinAPIEx.au3>
Opt('MustDeclareVars', 1)
Opt('TrayAutoPause', 0)
Global $sProcName = 'firefox.exe' ; Название процесса
Global $iIdleTime = 5 ; Время бездействия процесса, по истечении которого происходит сброс памяти, в минутах
Global $iMemMax = 100 ; Размер используемой процессом памяти, при котором происходит ее сброс, в мегабайтах
Global $iMemCritical = 400 ; Максимальный (критический) размер используемой процессом памяти, при котором происходит ее сброс в любом случае (независимо от времени простоя процесса), в мегабайтах
Global $ProcessID, $Size, $PID = 0, $Prev1 = 0, $Prev2 = 0, $Timer = 0
$iIdleTime *= 60 * 1000
$iMemMax *= 1024 * 1024
$iMemCritical *= 1024 * 1024
While 1
Sleep(500)
$ProcessID = ProcessExists($sProcName)
If $ProcessID Then
$Size = _GetProcessMemoryUsage($ProcessID)
If ($Size > $iMemCritical) Or (($Size > $iMemMax) And (_GetProcessIdleTime($ProcessID) > $iIdleTime)) Then
_WinAPI_EmptyWorkingSet($ProcessID)
_Reset()
EndIf
Else
_Reset()
EndIf
WEnd
Func _GetProcessIdleTime($ProcessID)
Local $Time1 = _WinAPI_GetProcessTimes($ProcessID)
Local $Time2 = _WinAPI_GetSystemTimes()
If (IsArray($Time1)) And (IsArray($Time2)) Then
$Time1 = $Time1[1] + $Time1[2]
$Time2 = $Time2[1] + $Time2[2]
If ($Prev1) And ($Prev2) And ($ProcessID = $PID) Then
If Round(($Time1 - $Prev1) / ($Time2 - $Prev2) * 100) > 1 Then
$Timer = 0
EndIf
Else
$Timer = 0
EndIf
$Prev1 = $Time1
$Prev2 = $Time2
$PID = $ProcessID
If $Timer Then
Return TimerDiff($Timer)
Else
$Timer = TimerInit()
Return 0
EndIf
EndIf
_Reset()
Return 0
EndFunc ;==>_GetProcessIdleTime
Func _GetProcessMemoryUsage($ProcessID)
Local $Data = _WinAPI_GetProcessMemoryInfo($ProcessID)
If Not @error Then
Return $Data[9]
EndIf
_Reset()
Return 0
EndFunc ;==>_GetProcessMemoryUsage
Func _Reset()
$Timer = 0
$PID = 0
EndFunc ;==>_Reset