3

Я пытаюсь отследить утечку памяти на ПК с Windows 7 Embedded Panel. Используя Perfmon, я вижу, что «% зафиксированных использованных байтов» постоянно растет со скоростью 0,77% в час, когда рассматриваемое приложение работает. На Win XP (не встроенных) системах с одинаковыми условиями она вообще не растет.

Мне любопытно узнать, как рассчитывается этот показатель, чтобы добавить в приложение свой собственный код мониторинга и регистрации. Используя вызов API GlobalMemoryStatus, я могу получить несколько цифр, но никакие сложности, о которых я могу подумать, не дают такого же% результата, как у Perfmon при мониторинге счетчика «% принятых байтов в использовании».

Как я могу получить этот параметр?

Обновить

Пример кода для Delphi приведен ниже. Просто создайте форму, поместите заметку и таймер на нее. Проверено под Win XP.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type TPerformanceInformation = packed record
    cb                 : DWORD ;
    CommitTotal        : integer;
    CommitLimit        : integer   ;
    CommitPeak         : Cardinal ;
    PhysicalTotal      : Cardinal ;
    PhysicalAvailable  : Cardinal   ;
    SystemCache        : Cardinal ;
    KernelTotal        : Cardinal ;
    KernelPaged        : integer ;
    KernelNonpaged     : Cardinal ;
    PageSize           : Cardinal ;
    HandleCount        : DWORD ;
    ProcessCount       : DWORD ;
    ThreadCount        : DWORD ;
    end ;

    TpPerformanceInformation = ^TPerformanceInformation ;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Memo1: TMemo;
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1 ;

function GetPerformanceInfo (
    pPerformanceInformation : TpPerformanceInformation ;
    cb                      : dword) : integer ; stdcall ; external 'psapi.dll' ;

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);

var
    Status           : TMemoryStatus;
    PerformanceInfo  : TPerformanceInformation ;

begin
Memo1.Clear ;
Status.dwLength := sizeof(TMemoryStatus) ;
GlobalMemoryStatus (Status) ;

Memo1.Lines.Add (Format ('Total memory used (%%)  : %u',[Status.dwMemoryLoad])) ;

Memo1.Lines.Add (Format ('Physical memory used   : %u',[(Status.dwTotalPhys - Status.dwAvailPhys)])) ;
Memo1.Lines.Add (Format ('Physical memory left   : %u',[Status.dwAvailPhys])) ;
Memo1.Lines.Add (Format ('Total physical memory  : %u',[Status.dwTotalPhys])) ;
Memo1.Lines.Add (Format ('Total physical used (%%): %1.2f',[100.0 * (Status.dwTotalPhys - Status.dwAvailPhys) / Status.dwTotalPhys])) ;

Memo1.Lines.Add (Format ('Total page file        : %u',[Status.dwTotalPageFile])) ;
Memo1.Lines.Add (Format ('Page file used         : %u',[(Status.dwTotalPageFile - Status.dwAvailPageFile)])) ;
Memo1.Lines.Add (Format ('Page file left         : %u',[Status.dwAvailPageFile])) ;
Memo1.Lines.Add (Format ('Page file used  (%%)    : %1.2f',[100.0 * (Status.dwTotalPageFile - Status.dwAvailPageFile) / Status.dwTotalPageFile])) ;

if (GetPerformanceInfo (Addr (PerformanceInfo), Sizeof (TPerformanceInformation)) <> 0) then
    begin
    with PerformanceInfo do
        begin
        Memo1.Lines.Add (Format ('CommitTotal      : %u',[CommitTotal])) ;
        Memo1.Lines.Add (Format ('CommitLimit      : %u',[CommitLimit])) ;
        Memo1.Lines.Add (Format ('CommitPeak       : %u',[CommitPeak])) ;
        Memo1.Lines.Add (Format ('PhysicalTotal    : %u',[PhysicalTotal])) ;
        Memo1.Lines.Add (Format ('PhysicalAvailable: %u',[PhysicalAvailable])) ;
        Memo1.Lines.Add (Format ('SystemCache      : %u',[SystemCache])) ;
        Memo1.Lines.Add (Format ('KernelTotal      : %u',[KernelTotal])) ;
        Memo1.Lines.Add (Format ('KernelPaged      : %u',[KernelPaged])) ;
        Memo1.Lines.Add (Format ('KernelNonpaged   : %u',[KernelNonpaged])) ;
        Memo1.Lines.Add (Format ('PageSize         : %u',[PageSize])) ;
        Memo1.Lines.Add (Format ('HandleCount      : %u',[HandleCount])) ;
        Memo1.Lines.Add (Format ('ProcessCount     : %u',[ProcessCount])) ;
        Memo1.Lines.Add (Format ('ThreadCount      : %u',[ThreadCount])) ;
        end ;
    end ;
end;

end.

1 ответ1

1

Проверьте GetPerformanceInfo(). Отбирает коммит номера.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .