speicherverbrauch nimmt immer weiter zu

  • hi leute...
    ich habe mir eine art "background" programm geschrieben was die ganze zeit im hintergrund läuft und von mir ständig erweitert wird...das programm besteht im groben aus einer schleife die alle 2.5 sekunden durch läuft :) so weit so gut zum programm :)

    nun zum "problem"...das programm benötigt am anfang gerade mal 3.056 kilobytes vom arbeitsspeicher..das ist ja recht wenig, da ich ja auch die priorität auf niedrig gesetzt habe :) allerdings steigt der speicherverbrauch nach ein paar stunden auf 24.012 kilobytes und mehr an :( das ist ja immer noch nicht viel, allerdings würde ich gerne wissen woran das liegt das der speicherverbrauch immer weiter annimmt :)

    weiß jemand woran das vielleicht liegen könnte? :)

    hier mal mein script

    Spoiler anzeigen
    [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Icon=Background.ico
    #AutoIt3Wrapper_Outfile=Z:\BackUps\AutoIt - Scripts\##Fertig\Background\Background.exe
    #AutoIt3Wrapper_Outfile_x64=Background.exe
    #AutoIt3Wrapper_Res_Language=1031
    #AutoIt3Wrapper_Res_requestedExecutionLevel=asInvoker
    #AutoIt3Wrapper_Tidy_Stop_OnError=n
    #AutoIt3Wrapper_Res_FileVersion=1.12.33.0
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    ; =====================================================================
    ; Variablen defnieren
    ; =====================================================================
    Global Const $s_autorun_keyname = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run"
    Global Const $s_valuename = "Background"
    Global Const $s_path = @ScriptDir & "\Background.exe"
    Global Const $s_ini_path = @ScriptDir & "\Background.ini"
    Global $a_tray_menue[6] = ["WinTimeKill öffnen", "PC reinigen", "", "Über...", "", "Beenden"]
    Global $a_tray_onevent[6] = ["_OpenWinTimeKill", "_CleanPC", "_Default", "_About", "", "_Terminate"]
    ; =====================================================================
    ; Vorbereitung
    ; =====================================================================
    Sleep(1000)

    [/autoit] [autoit][/autoit] [autoit]

    If Not IsAdmin() Then
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Opt("WinTitleMatchMode", 2)
    Opt("TrayOnEventMode", 1)
    Opt("TrayMenuMode", 3)

    [/autoit] [autoit][/autoit] [autoit]

    Sleep(5000)

    [/autoit] [autoit][/autoit] [autoit]

    $a_path = _FileGetType()

    [/autoit] [autoit][/autoit] [autoit]

    If $a_path[1] = "exe" Then
    ProcessSetPriority($a_path[0] & "." & $a_path[1], 0)
    RegRead($s_autorun_keyname, $s_valuename)
    If @error Then RegWrite($s_autorun_keyname, $s_valuename, "REG_SZ", $s_path)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Sleep(5000)

    [/autoit] [autoit][/autoit] [autoit]

    _DriveInkOnDesktopStartUp()
    ; =====================================================================
    ; =====================================================================
    ; Hauptprogramm
    ; =====================================================================
    ; =====================================================================
    If @WDAY == 6 Then
    MsgBox(64, "Spartacus - Info", "Eine neue Folge von 'Spartacus' erscheint heute!" & @CRLF & "Der Link befindet sich im Zwischenspeicher!", 5)
    ClipPut("http://www.myvideo.de/channel/spartacus")
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To UBound($a_tray_menue, 1) - 1
    $a_tray_menue[$i] = TrayCreateItem($a_tray_menue[$i])
    TrayItemSetOnEvent($a_tray_menue[$i], $a_tray_onevent[$i])
    Next

    [/autoit] [autoit][/autoit] [autoit]

    While Sleep(2500)
    _CreateDriveInkOnDesktop()
    If _GetCPUUsed() > 45 Then
    Do
    Sleep(10000)
    Until _GetCPUUsed() < 35
    EndIf
    Select
    Case ProcessExists("farcry2.exe")
    ProcessWaitClose("farcry2.exe")
    Sleep(2000)
    DirCopy("C:\Users\RedHead\Documents\My Games\Far Cry 2", "Z:\BackUps\Spielstände\My Games\Far Cry 2", 1)
    MsgBox(64, "FarCry 2 - Info", "Fertig kopiert!", 3)
    Case WinExists("Fehlerhafter oder fehlender AVI-Index")
    WinActivate("Fehlerhafter oder fehlender AVI-Index")
    For $x = 0 To 5 Step 1
    MouseClick("left", Random(770, 790, 1), Random(490, 500, 1))
    Sleep(500)
    Next
    Sleep(5000)
    If WinExists("Repariere AVI-Index...") Then
    WinKill("Repariere AVI-Index...")
    Sleep(400)
    WinActivate("VLC")
    Sleep(400)
    Send("{n}")
    EndIf
    Case ProcessExists("BattlefrontII.exe")
    ProcessWaitClose("BattlefrontII.exe")
    If MsgBox(64 + 4, "BattelfrontII - Info", "Ein BackUp der Spielstände anlegen?") = 6 Then
    DirCopy("C:\Spiele\BFII\GameData\SaveGames", "Z:\BackUps\Spielstände\AutoIt-Background\BattelfrontII", 1)
    DirCopy("C:\Spiele\BFII\GameData\SaveGames", "Z:\Startkid\Star Wars Battelfront 2\SaveGames", 1)
    MsgBox(64, "BattelfrontII - Info", "Fertig kopiert!", 3)
    EndIf
    Case WinExists("Facebook - anmelden")
    If MsgBox(4 + 262144 + 32, "Facebook - Info", "Anmelden?") = 6 Then
    ;die stellen hier habe ich natürlich entfernt :P
    Else
    Sleep(10000)
    EndIf
    EndSelect
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _About()
    Return MsgBox(64, "Über...", "Autor:" & @TAB & "RedHead!" & @CRLF & "Version:" & @TAB & FileGetVersion(@ScriptFullPath))
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _OpenWinTimeKill()
    ShellExecute(@ScriptDir & "\WinTimeKill.exe")
    If @error Then MsgBox(48, "Error", "WinTimeKill.exe konnte nicht gestartet werden!" & @CRLF & _
    "Wahrscheinlich befindet sich die Datei nicht mir am angegebenen Ort" & @CRLF & _
    "oder wurde gelöscht!")
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _CleanPC()
    Local $s_PathAuslogicsRegistryCleaner = "C:\Utils\Auslogics Registry Cleaner\RegCleaner.exe"
    Local $s_PathCCleaner = "C:\Utils\CCleaner\CCleaner64.exe"

    [/autoit] [autoit][/autoit] [autoit]

    If ProcessExists("firefox.exe") Then Return MsgBox(16, "Achtung!", "Firefox muss geschlossen sein!")
    ShellExecute($s_PathCCleaner)
    If Not @error Then
    WinWait("Piriform CCleaner")
    $s_title = WinGetTitle("Piriform CCleaner")
    Sleep(200)
    ControlClick($s_title, "", "Button1")
    Do
    Sleep(1000)
    Until ControlCommand($s_title, "", "Button3", "IsEnabled", "")
    Sleep(500)
    ControlClick($s_title, "", "Button3")
    Sleep(500)
    Do
    Sleep(1000)
    Until ControlCommand($s_title, "", "Button3", "IsEnabled", "")
    Sleep(500)
    ControlClick($s_title, "", "Button5")
    Sleep(500)
    ControlClick($s_title, "", "Button2")
    Sleep(500)
    ;~ Do
    ;~ Sleep(1000)
    ;~ Until ControlCommand($s_title, "", "Button3", "IsEnabled", "")
    ;~ Sleep(15000)
    ;~ Sleep(500)
    ;~ ControlClick($s_title, "", "Button3")
    ;~ Sleep(500)
    ;~ WinWait("CCleaner")
    ;~ ControlClick("CCleaner", "", "Button1")
    ;~ Sleep(500)
    ;~ WinWait("Speichern unter")
    ;~ Sleep(500)
    ;~ ControlClick("Speichern unter", "", "Button1")
    Do
    Sleep(1000)
    MsgBox(64, "INFO", "Bitte 'CCleaner' schließen!", 5)
    Until Not ProcessExists("CCleaner64.exe")
    Else
    MsgBox(16, "ERROR!", "'CCleaner' befindet sich nicht am angegebenen Pfad!")
    EndIf

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ShellExecute($s_PathAuslogicsRegistryCleaner)
    If Not @error Then
    WinWait("Auslogics Registry Cleaner")
    $s_title = WinGetTitle("Auslogics Registry Cleaner")
    ControlClick($s_title, "", "TAxDropDownButton201")
    Do
    Sleep(100)
    Until ControlCommand($s_title, "", "TButton1", "IsVisible")
    ControlClick($s_title, "", "TButton1")
    Sleep(500)
    ProcessClose("RegCleaner.exe")
    Else
    MsgBox(16, "ERROR!", "'RegistryCleaner' befindet sich nicht am angegebenen Pfad!")
    EndIf

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Default()
    Return 0
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Terminate()
    Exit
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _FileGetType($s_path = @ScriptFullPath)
    Local $a_file[2]
    If StringRegExp(StringLeft($s_path, 1), "[a-zA-Z]") And StringMid($s_path, 2, 1) == ":" Then
    $a_path = StringSplit($s_path, "\")
    $a_path = StringSplit($a_path[$a_path[0]], ".")
    $a_file[0] = $a_path[1]
    $a_file[1] = $a_path[2]
    Return $a_file
    Else
    Return SetError(-1)
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _DriveInkOnDesktopStartUp()
    Local $a_drive = DriveGetDrive("ALL")
    Local $a_driveondesktop = _GetDriveInkOnDesktop()
    Local $f_notfound = True, $s_drivelabel = ""

    [/autoit] [autoit][/autoit] [autoit]

    If $a_drive[0] <> $a_driveondesktop[0] Then
    For $i = 1 To $a_drive[0]
    $a_drive[$i] = StringUpper(StringLeft($a_drive[$i], 1)) & ":"
    $f_notfound = True
    For $x = 1 To $a_driveondesktop[0]
    If StringLeft($a_drive[$i], 1) = StringMid($a_driveondesktop[$x], 2, 1) Then $f_notfound = False
    Next
    If $f_notfound Then
    $s_drivelabel = DriveGetLabel($a_drive[$i])
    If @error Then $s_drivelabel = "UNKNOWN"
    FileCreateShortcut($a_drive[$i] & "\", @DesktopDir & "\(" & StringLeft($a_drive[$i], 1) & ") - " & $s_drivelabel)
    EndIf
    Next
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _CreateDriveInkOnDesktop()
    Local $a_drive = DriveGetDrive("ALL")
    Local $a_driveondesktop = _GetDriveInkOnDesktop()
    Local $f_notfound = True, $s_drivelabel = "", $f_delete = True, $f_nichtidentisch = True

    [/autoit] [autoit][/autoit] [autoit]

    If $a_drive[0] <> $a_driveondesktop[0] Then
    For $i = 1 To $a_drive[0]
    $a_drive[$i] = StringUpper(StringLeft($a_drive[$i], 1)) & ":"
    $f_notfound = True
    For $x = 1 To $a_driveondesktop[0]
    If StringLeft($a_drive[$i], 1) = StringMid($a_driveondesktop[$x], 2, 1) Then $f_notfound = False
    Next
    If $f_notfound Then
    $s_drivelabel = DriveGetLabel($a_drive[$i])
    If @error Then $s_drivelabel = "UNKNOWN"
    FileCreateShortcut($a_drive[$i] & "\", @DesktopDir & "\(" & StringLeft($a_drive[$i], 1) & ") - " & $s_drivelabel)
    EndIf
    Next
    For $i = 1 To $a_driveondesktop[0]
    $f_delete = True
    For $x = 1 To $a_drive[0]
    If StringMid($a_driveondesktop[$i], 2, 1) = StringLeft($a_drive[$x], 1) Then $f_delete = False
    Next
    If $f_delete Then FileDelete(@DesktopDir & "\" & $a_driveondesktop[$i])
    Next
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _GetDriveInkOnDesktop()
    Local $h_search = FileFindFirstFile(@DesktopDir & "\*")
    Local $s_inkfiles = "", $a_array[1] = [0]

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $s_file = FileFindNextFile($h_search)
    If @error Then ExitLoop
    If StringLeft($s_file, 1) = "(" And StringRegExp(StringMid($s_file, 2, 1), "[a-zA-Z]") And StringMid($s_file, 3, 1) = ")" Then $s_inkfiles &= $s_file & "|"
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    If $s_inkfiles = "" Then
    Return $a_array
    Else
    Return StringSplit(StringTrimRight($s_inkfiles, 1), "|")
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _GetCPUUsed()
    Local $wbemFlags = 0x10 + 0x20
    Local $strComputer = @ComputerName

    [/autoit] [autoit][/autoit] [autoit]

    Local $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
    Local $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_Processor", "WQL", $wbemFlags)

    [/autoit] [autoit][/autoit] [autoit]

    Local $c = 0
    Local $sMsg = ""

    [/autoit] [autoit][/autoit] [autoit]

    For $objItem In $colItems
    $sMsg &= "cpu%" & $objItem.LoadPercentage
    Next

    [/autoit] [autoit][/autoit] [autoit]

    $CpuAuslastung = StringSplit($sMsg, "cpu%", 1)

    [/autoit] [autoit][/autoit] [autoit]

    For $n = "0" To $CpuAuslastung[0]
    $c += $CpuAuslastung[$n]
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Return (Round($c / $CpuAuslastung[0], 0))
    EndFunc

    [/autoit]
  • Ich glaube das ist normal. Beobachte mal andere Programme. Ich glaube bei denen verhält es sich ähnlich. Woran das genau liegt, kann ich dir aber nicht sagen.

    Gruss Shadowigor

  • Könnte dies einfach an While-Schleifen und anderem liegen? Oder aber der PC speichert ohne dein Wissen einfach Daten deines Programmes vorrätig in den RAM sodass es schneller aufrufbar ist? Oder habe ich da was missverstanden.

    Grüße

  • Mal ein kleines Beispiel:

    Demonstration Einfluss von FileClose auf Speicherverbrauch
    [autoit]

    While 1
    TestFunktion()
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func TestFunktion()
    Local $s_file
    Local $h_search = FileFindFirstFile(@DesktopDir & "\*")

    [/autoit] [autoit][/autoit] [autoit]

    Do
    $s_file = FileFindNextFile($h_search)
    If @error Then ExitLoop
    Until 0
    ;FileClose($h_search)
    EndFunc

    [/autoit]


    Einmal so ausführen und den Speicherverbrauch beobachten und danach mal das FileClose() auskommentieren.

    Ansonsten ein paar kleine Sachen:
    Du rufst dauernd die Funktion _GetCPUUsed() auf.
    In dieser wird bei jedem Aufruf ein neues WMI-Objekt erstellt und die Werte komplett neu abgefragt.
    Besser wäre es das WMI-Objekt nur einmal zu erstellen in dem man es global erstellt oder als Static deklariert.
    Eine Alternative wäre es, das dafür vorgesehene WMI-Refresher-Objekt einzusetzen.
    Auch wenn Win32_Processor.LoadPercentage bei mir keinen Wert besitzt hier dennoch mal als kleinen Gedankenanstoß hierzu:

    Beispiel für den Einsatz des WMI-Refresher Objektes
    [autoit]

    While 1
    _GetCPUUsed2()
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _GetCPUUsed2()
    Local Static $o_WMI = ObjGet("winmgmts:\\.\root\cimv2")
    Local Static $o_WMIRefresher = ObjCreate("WbemScripting.Swbemrefresher")
    Local Static $o_CPULoadPercentage = $o_WMIRefresher.AddEnum ($o_WMI, "Win32_Processor").objectSet

    [/autoit] [autoit][/autoit] [autoit]

    $o_WMIRefresher.Refresh
    For $i in $o_CPULoadPercentage
    ConsoleWrite($i.LoadPercentage & @TAB)
    Next
    ConsoleWrite(@CRLF)
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von AspirinJunkie (3. September 2012 um 12:37)

  • Ich glaube das ist normal. Beobachte mal andere Programme. Ich glaube bei denen verhält es sich ähnlich. Woran das genau liegt, kann ich dir aber nicht sagen.


    also ich habe ja kein anderes programm welches die ganze zeit im hintergrund läuft bzw. eins das sehr lange läuft...also kann ich das nicht vergleichen ;) aber trotzdem danke für den vorschlag :)

    Du rufst dauernd die Funktion _GetCPUUsed() auf.

    In dieser wird bei jedem Aufruf ein neues WMI-Objekt erstellt und die Werte komplett neu abgefragt.

    Besser wäre es das WMI-Objekt nur einmal zu erstellen in dem man es global erstellt oder als Static deklariert.

    Eine Alternative wäre es, das dafür vorgesehene WMI-Refresher-Objekt einzusetzen.

    ok danke für den tipp :) werde ich abändern ;)

    Könnte dies einfach an While-Schleifen und anderem liegen? Oder aber der PC speichert ohne dein Wissen einfach Daten deines Programmes vorrätig in den RAM sodass es schneller aufrufbar ist? Oder habe ich da was missverstanden.

    das programm läuft ja die ganze zeit im hintergrund ;) muss also nur einmal gestartet werden und fertig ;)


    ich werde den teil mit _GetCPUUsed() einmal überarbeiten und dann mal schauen ob sich da was geändert hat :)
    danke für die vorschläge ;)

    • Offizieller Beitrag

    AspirinJunkie hat Dir doch schon gezeigt, woran (fehlendes FileClose) der steigende Speicherverbrauch liegt.
    Du musst in der Funktion "_GetDriveInkOnDesktop()" nach dem WEnd ein

    [autoit]

    FileClose($h_search)

    [/autoit]


    einfügen, sonst wird das Handle nicht geschlossen.

  • Na ja, ist doch so oder etwa nicht? Der PC speicher Daten in den RAM und entfernt nicht alle wieder. Oder hat man mir dort eine Lüge beigebracht? Funktioniert doch etwa so wie ein Cookie, oder nicht?