53 votes

Comment obtenir la mémoire utilisée par un programme Delphi

Je sais comment faire pour obtenir l'utilisation de la mémoire Système à l'aide de GlobalMemoryStatusEx, mais qui me dit que la que la totalité du système d'exploitation est à l'aide.

Je veux vraiment que mon programme rapport de combien de mémoire il est seul affecté et est à l'aide.

Est-il possible dans mon Delphi 2009 programme à appeler une fonction de Windows ou peut-être que certains FastMM fonction pour trouver le mémoire qui a été allouée par mon programme tout seul?


Revisiter à ma question, j'ai changé mes accepté de répondre à la GetMemoryManagerState réponse par @apenwarr. Il produit des résultats identiques à la GetHeapStatus fonction (aujourd'hui obsolète) que j'ai utilisé, alors que GetProcessMemoryInfo.WorkingSetSize a donné un résultat très différent.

84voto

apenwarr Points 4956

Vous pouvez obtenir des informations utiles sur l'utilisation de la mémoire hors de l'exécution de Delphi sans utiliser d'appels directs Win32:

 function MemoryUsed: cardinal;
var
    st: TMemoryManagerState;
    sb: TSmallBlockTypeState;
begin
    GetMemoryManagerState(st);
    result := st.TotalAllocatedMediumBlockSize + st.TotalAllocatedLargeBlockSize;
    for sb in st.SmallBlockTypeStates do begin
        result := result + sb.UseableBlockSize * sb.AllocatedBlockCount;
    end;
end;
 

La meilleure chose à propos de cette méthode est qu’elle est rigoureusement suivie: lorsque vous allouez de la mémoire, elle augmente, et lorsque vous libérez de la mémoire, elle diminue immédiatement du même montant. Je l'utilise avant et après l'exécution de chacun de mes tests unitaires, afin de pouvoir déterminer quel test perd de la mémoire (par exemple).

28voto

Jim McKeeth Points 22637

À partir d'un vieux post de blog de la mine.

Voulez savoir combien de mémoire de votre programme à l'aide? Cette Delphi fonction fera l'affaire.

uses psAPI;

{...}

function CurrentProcessMemory: Cardinal;
var
  MemCounters: TProcessMemoryCounters;
begin
  MemCounters.cb := SizeOf(MemCounters);
  if GetProcessMemoryInfo(GetCurrentProcess,
      @MemCounters,
      SizeOf(MemCounters)) then
    Result := MemCounters.WorkingSetSize
  else
    RaiseLastOSError;
end;

Vous ne savez pas où j'ai acquis les bases, mais j'ai ajouté un peu mieux la gestion des erreurs et une fonction. WorkingSetSize est la quantité de mémoire actuellement utilisée. Vous pouvez utiliser un code similaire pour obtenir d'autres valeurs pour le processus en cours (ou un processus). Vous aurez besoin d'inclure psAPI dans votre utilise l'instruction.

L' *PROCESS_MEMORY_COUNTERS* enregistrement comprend:

  • PageFaultCount
  • PeakWorkingSetSize
  • WorkingSetSize
  • QuotaPeakPagedPoolUsage
  • QuotaPagedPoolUsage
  • QuotaPeakNonPagedPoolUsage
  • QuotaNonPagedPoolUsage
  • PagefileUsage
  • PeakPagefileUsage

Vous pouvez trouver l'ensemble de ces valeurs dans le Gestionnaire des Tâches ou Process Explorer.

4voto

François Points 17557

Vous pouvez voir un exemple d'utilisation de FastMM avec le projet UsageTrackerDemo fourni avec les démonstrations lorsque vous téléchargez l'ensemble complet de FastMM4 à partir de SourceForge.

4voto

Gerard Points 1672

J'ai écrit cette petite fonction pour retourner l'utilisation de la mémoire du processus actuel (app):

 function ProcessMemory: longint;
var
  pmc: PPROCESS_MEMORY_COUNTERS;
  cb: Integer;
begin
  // Get the used memory for the current process
  cb := SizeOf(TProcessMemoryCounters);
  GetMem(pmc, cb);
  pmc^.cb := cb;
  if GetProcessMemoryInfo(GetCurrentProcess(), pmc, cb) then
     Result:= Longint(pmc^.WorkingSetSize);

  FreeMem(pmc);
end;
 

1voto

Gant Points 9920

Pour l'API Win32, vous avez besoin de la fonction GetProcessMemoryInfo . Voici un exemple tiré de la page MSDN, mais le code est en C ++. Je pense que vous pouvez également le convertir en Delphi. Ce que vous cherchez s'appelle probablement "Taille du jeu de travail".

 #include <windows.h>
#include <stdio.h>
#include <psapi.h>

void PrintMemoryInfo( DWORD processID )
{
    HANDLE hProcess;
    PROCESS_MEMORY_COUNTERS pmc;

    // Print the process identifier.

    printf( "\nProcess ID: %u\n", processID );

    // Print information about the memory usage of the process.

    hProcess = OpenProcess(  PROCESS_QUERY_INFORMATION |
                                    PROCESS_VM_READ,
                                    FALSE, processID );
    if (NULL == hProcess)
        return;

    if ( GetProcessMemoryInfo( hProcess, &pmc, sizeof(pmc)) )
    {
        printf( "\tPageFaultCount: 0x%08X\n", pmc.PageFaultCount );
        printf( "\tPeakWorkingSetSize: 0x%08X\n", 
                  pmc.PeakWorkingSetSize );
        printf( "\tWorkingSetSize: 0x%08X\n", pmc.WorkingSetSize );
        printf( "\tQuotaPeakPagedPoolUsage: 0x%08X\n", 
                  pmc.QuotaPeakPagedPoolUsage );
        printf( "\tQuotaPagedPoolUsage: 0x%08X\n", 
                  pmc.QuotaPagedPoolUsage );
        printf( "\tQuotaPeakNonPagedPoolUsage: 0x%08X\n", 
                  pmc.QuotaPeakNonPagedPoolUsage );
        printf( "\tQuotaNonPagedPoolUsage: 0x%08X\n", 
                  pmc.QuotaNonPagedPoolUsage );
        printf( "\tPagefileUsage: 0x%08X\n", pmc.PagefileUsage ); 
        printf( "\tPeakPagefileUsage: 0x%08X\n", 
                  pmc.PeakPagefileUsage );
    }

    CloseHandle( hProcess );
}

int main( )
{
    // Get the list of process identifiers.

    DWORD aProcesses[1024], cbNeeded, cProcesses;
    unsigned int i;

    if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
        return 1;

    // Calculate how many process identifiers were returned.

    cProcesses = cbNeeded / sizeof(DWORD);

    // Print the memory usage for each process

    for ( i = 0; i < cProcesses; i++ )
        PrintMemoryInfo( aProcesses[i] );

    return 0;
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X