Freien Speicher ermitteln



  • Ist schon erschreckend, habe bei frisch gebootetem Rechner 159 MB frei.
    Nach dem Start und beenden einiger Applicationen (Mozilla FireFox, Outlook,
    Notepad....) bin ich nun bei 120MB.
    Wie gesagt alle Programme sind wieder beendet worden.

    Sind diese Applicationen alle so schlampig programmiert, oder warum geben sie
    denn Speicher nicht mehr frei.



  • Auf was für einen Wert schaust Du denn???
    Wenn sich ein Programm beendet dann wird der gesamte Speicher dieses Prozesses freigegen, unabhängig davon ob es schlampig oder gut programmiert wurde...



  • Auf den mit GlobalMemoryStatus(&MemStatus) ermittelten Wert, umgerechnet
    auf MB.



  • Und welchen von denen? Hoffentlich nicht "dwAvailPhys", der sagt nämlich gar nichts aus...



  • genau dwAvailPhys.
    Welchen sollte ich den da benutzen?



  • Die Frage ist: Was willst Du überhaupt wissen???



  • Ich möchte denn momentan noch verfügbaren Speicher ermitteln, da wie
    ich schon erwähnte einige meiner Applicationen den Speicher langsam
    aufbrauchen.

    Das ständig laufende Tool ermittelt einmal pro Sekunde den noch verfügbaren
    Speicher und zeigt diesen an.

    Der angezeigte Wert scheint auch ok zu sein, wenn ich versuche bei nur
    noch wenigem Speicher den Borland Builder zu starten kommt die Fehlermeldung
    das eine Library nicht mehr geladen werden kann.



  • hermes schrieb:

    Ich möchte denn momentan noch verfügbaren Speicher ermitteln, da wie
    ich schon erwähnte einige meiner Applicationen den Speicher langsam
    aufbrauchen.

    Dann kümmere Dich doch bitte um den Speicher der einzelnen Applikationen und nicht um den Speicher des OS!!!
    Also: "GetProcessMemoryInfo" und hier speziell "PagefileUsage". Das ist das was angibt wie viel Speicher der Prozess braucht. Und wenn es steigt dann hat er ein "Speicherleck".

    hermes schrieb:

    Das ständig laufende Tool ermittelt einmal pro Sekunde den noch verfügbaren Speicher und zeigt diesen an.

    Das ist total sinnols... mache es bitte auf Prozess-Ebene, sonst hast Du keine Aussagekräftige Daten!
    Also z.B. via "EnumProcesses" und "OpenProcess" und dann die obige Funktion.

    hermes schrieb:

    Der angezeigte Wert scheint auch ok zu sein

    Er ist aber nicht aussagekräftig... Du kannst weder sagen, welcher Prozess den Speicher benötigt noch hilft er Dir in irgendeiner Form. Auch steigt der Speicher wieder an, wenn Du alle Fenster minimierst... was ja aber eigentlich an der Speicherauslastung nichts ändert...



  • Danke erstmal für die Tips, werde das ganze mal umsetzen.

    Eine Frage noch, wie komme ich an den Handle der Application die ich überwachen
    möchte.



  • hermes schrieb:

    Eine Frage noch, wie komme ich an den Handle der Application die ich überwachen möchte.

    Hab ich doch gesagt 😕
    EnumProcesses und OpenProcess...



  • Aus der SDK.

    Parameters

    dwDesiredAccess
    [in] Access to the process object. This access right is checked against the security descriptor for the process. This parameter can be one or more of the process access rights.

    If the caller has enabled the SeDebugPrivilege privilege, the requested access is granted regardless of the contents of the security descriptor.
    bInheritHandle
    [in] If this value is TRUE, processes created by this process will inherit the handle. Otherwise, the processes do not inherit this handle.
    dwProcessId
    [in] Identifier of the process to open.

    Return Values

    If the function succeeds, the return value is an open handle to the specified process.

    dwProcessId
    [in] Identifier of the process to open.

    Wo bekomme ich den Parameter her?



  • hermes schrieb:

    Wo bekomme ich den Parameter her?

    Hat er doch gesagt: EnumProcesses.



  • The EnumProcesses function retrieves the process identifier for each process object in the system.

    BOOL EnumProcesses(
    DWORD* pProcessIds,
    DWORD cb,
    DWORD* pBytesReturned
    );

    Parameters

    pProcessIds
    [out] Pointer to an array that receives the list of process identifiers.
    cb
    [in] Size of the pProcessIds array, in bytes.
    pBytesReturned
    [out] Number of bytes returned in the pProcessIds array.

    Verstehe nur "Bahnhof", hast du mal ein kleines Beispiel?



  • Die mit [out] gekennzeichneten Parameter werden von der Funktion mit Werten gefüllt, da mußt du nur den nötigen Speicherplatz bereitstellen.

    (und Die MSDN bietet dir sogar ein Beispiel, wie die Funktion genutzt werden kann - lesen bildet ;))



  • Versuche gerade EnumProcesses mit dem Builder.

    Linke die lib psapi.lib dazu, es wird aber noch die psapi.dll benötigt.
    Diese DLL habe ich mir besorgt, nun kommt allerdings die Fehlermeldung

    Die Datei PSAPI.DLL ist verknüpft mit dem fehlenden NTDLL.DLL .......

    Brauche ich die NTDLL.DLL ebenfalls, ich benutze allerdings Win98SE, hier handelt
    es sich aber um eine NT DLL.



  • hermes schrieb:

    ich benutze allerdings Win98SE,

    MSDN Library, Anforderungen von EnumProcesses:
    Requires Windows XP, Windows 2000 Professional, or Windows NT Workstation 4.0.



  • Also auf XP umsteigen, ist das mit ServicePac2 wirklich sicher (Viren,Würmer etc.) oder würdest du 2000 empfehlen.


Anmelden zum Antworten