Wieviel Arbeitsspeicher belegt ein Programm?

  • Hi,

    mit MemGetStats() bekommt man ja die Info wieviel Ram zur zeit belegt, frei, prozentual genutzt usw. ist. Wie kann ich aber nun herrausfinden wieviel Arbeitsspeicher ein bestimmtes Programm aktuell belegt?

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

    Einmal editiert, zuletzt von chip (26. Februar 2010 um 11:24)

  • Da kommt bei mir leider nur CPU: 0 und Ram:0

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Hi,

    warst schon ganz nah dran. Nimm anstatt Programm Prozess -> .....
    ProcessGetStats sollte des Rätsels Lösung sein

    ;-))
    Stefan

  • Bekomme ich leider auch nur falsche Werte die teilweiße bis zu 30k vom Wert, der im Taskmanager angezeigt wird, abweicht. z.b. Firefox.exe verbraucht 145k und ProcessGetStats spuckt dann 177k aus.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Da kommt bei mir leider nur CPU: 0 und Ram:0

    CPU 0% ist ja klar, da Calc.exe ja nichts macht! Kannst ja mal 999999! berechnen!

    Bei mir sieht es so aus: calc.exe | PID: 7712 | CPU time: 0:00:00.046 (h:m:s.ms) | Mem usage: 5264 KB | CPU usage: 0 %

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • CPU 0% ist ja klar, da Calc.exe ja nichts macht! Kannst ja mal 999999! berechnen!

    Bei mir sieht es so aus: calc.exe | PID: 7712 | CPU time: 0:00:00.046 (h:m:s.ms) | Mem usage: 5264 KB | CPU usage: 0 %

    Gruß,
    UEZ


    Und bei mir so auch nach dem rechnen:
    calc.exe | PID: 1776 | CPU time: 0:00:00.249 (h:m:s.ms) | Mem usage: 0 KB | CPU usage: 0 %

    CPU geht wären der Rechenzeit kurz hoch aber Mem bleibt in der Anzeige auf 0.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Win 7 x64.

    Hast recht! Auf Win7 x64 im native 64-bit mode geht's nicht! Kompiliere es doch mal vorher mit der Option: #AutoIt3Wrapper_UseX64=n oder RMT -> Compile Script (x86)!

    Ich muss mal sehen, wie der Code unter x64 im native mode umgestrickt werden muss...

    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Compile Script (x86) geht aber wie bei ProcessGetStats mit großen Abweichungen.

    Im calc.exe Beispiel wird 11540 KB angezeigt laut Taskmanager sind es aber nur 5004

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Compile Script (x86) geht aber wie bei ProcessGetStats mit großen Abweichungen.

    Im calc.exe Beispiel wird 11540 KB angezeigt laut Taskmanager sind es aber nur 5004

    Komisch! Und die Datei im Anhang?

    Richtig: unter x64 wird der Mem doppelt so viel angezeigt. Muss mal nachforschen!

    UEZ

  • Kein Unterschied leider, immernoch mehr als das Doppelte der Taskmanageranzeige.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Hi,

    getestet unter XP SP3 32 Bit:

    [autoit]


    #include <array.au3>
    Global $strComputer = "localhost"
    $arprocstat = _getproc ()
    _ArrayDisplay ($arprocstat)

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

    Func _getproc ()
    ; Generated by AutoIt Scriptomatic
    Local $artemp [1] [2], $count = 1, $struser, $strdomain
    $wbemFlagReturnImmediately = 0x10
    $wbemFlagForwardOnly = 0x20
    $colItems = ""
    $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_Process", "WQL", _
    $wbemFlagReturnImmediately + $wbemFlagForwardOnly)

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

    If IsObj($colItems) then
    For $objItem In $colItems
    ReDim $artemp [$count] [2]
    $artemp [$count - 1] [0] = $objItem.Caption
    ;realer Speicher in kb
    $artemp [$count - 1] [1] = $objItem.WorkingSetSize / 1024
    $count += 1
    Next
    Else
    Return 0
    EndIf
    Return $artemp
    EndFunc

    [/autoit]

    ;-))
    Stefan

  • Das gleiche, die Werte sind teilweiße doppelt so hoch wie im Taskmanager.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Ich installier später vielleicht mal Win 7 x86 dann weiß man zumindestens ob es an der Version oder an Win 7 an sich liegt.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Folgendes sollte nur als 32bit-Version kompiliert funktionieren aber vielleicht erkennst du daran ob du nicht vielleicht 2 unterschiedliche Werte vergleichst, denn soweit ich mich erinnern kann zeigt der TaskManager den Wert WorkingSetSize an:

    Spoiler anzeigen
    [autoit]

    $Prozessname = "calc.exe"
    $PMemInfo = _GetProcessMemInfo($Prozessname)

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

    $Text = $Prozessname & @CRLF & @CRLF & _
    "PeakWorkingSetSize: " & $PMemInfo[0] & ' kb' & @CRLF & _
    "WorkingSetSize: " & $PMemInfo[1] & ' kb' & @CRLF & _
    "QuotaPeakPagedPoolUsage: " & $PMemInfo[2] & ' kb' & @CRLF & _
    "QuotaPagedPoolUsage: " & $PMemInfo[3] & ' kb' & @CRLF & _
    "QuotaPeakNonPagedPoolUsage: " & $PMemInfo[4] & ' kb' & @CRLF & _
    "QuotaNonPagedPoolUsage: " & $PMemInfo[5] & ' kb' & @CRLF & _
    "PagefileUsage: " & $PMemInfo[6] & ' kb' & @CRLF & _
    "PeakPagefileUsage: " & $PMemInfo[7] & ' kb' & @CRLF & _
    "PrivateUsage: " & $PMemInfo[8] & ' kb'

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

    MsgBox(0,"", $Text)

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

    ;by AspirinJunkie
    Func _GetProcessMemInfo($PID)
    Local $PROCESS_MEMORY_COUNTERSEX, $StructSize, $PHandle, $StructPointer
    Local $RetArray[9]

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

    If IsString($PID) Then $PID = ProcessExists($PID)
    If $PID < 1 Then Return SetError(1,1,$RetArray)

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

    $PHandle = DllCall("Kernel32.dll", "int", "OpenProcess", "dword", 0x400 + 0x10, "dword", False, "dword", $PID)
    If @error Or Not $PHandle[0] Then Return SetError(2,2,$RetArray)

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

    $PHandle = $PHandle[0]

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

    $PROCESS_MEMORY_COUNTERSEX = DllStructCreate("dword; dword; uint; uint; uint; uint; uint; uint; uint; uint; uint")
    $StructSize = DllStructGetSize($PROCESS_MEMORY_COUNTERSEX)
    $StructPointer = DllStructGetPtr($PROCESS_MEMORY_COUNTERSEX)

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

    DllCall("Psapi.dll", "int", "GetProcessMemoryInfo", "hwnd", $PHandle, "ptr", $StructPointer, "dword", $StructSize)
    DllCall("Kernel32.dll", "int", "CloseHandle", "hwnd", $PHandle)

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

    For $i = 0 To 8
    $RetArray[$i] = DllStructGetData($PROCESS_MEMORY_COUNTERSEX, $i + 2) / 1024
    Next

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

    Return $RetArray
    EndFunc

    [/autoit]


    Außerdem solltest du beachten dass es sich immer nur um eine Momentaufnahme handelt und die Werte sich durchaus verändern können.

  • Bei ProcessGetStats kannst ja auch WorkingSetSize und PeakWorkingSetSize anzeigen lassen und beide stimmen dort auch nicht. Unter Win XP gehen die Scripte bei mir ja auch nur nicht unter Win 7 x64.

    Dein Script geht leider auch nicht, werden garkeine Werte vor "kb" angezeigt.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.