Windows 7 Embedded PanelPCのメモリリークを追跡しようとしています。 Perfmonを使用すると、問題のアプリが実行されているときに、「使用中のコミット済みバイトの割合」が1時間あたり0.77%の割合で着実に増加していることがわかります。 Win XP(組み込みではない)システムでは、同じ条件で、まったく成長しません。
独自の監視コードとログコードをアプリに追加する目的で、この指標がどのように計算されるのか知りたいです。 GlobalMemoryStatus API呼び出しを使用すると、いくつかの数値を取得できますが、「使用中のコミット済みバイト数」カウンターを監視するときにPerfmonが行うのと同じ%の結果が得られるとは考えられません。
このパラメータを取得するにはどうすればよいですか?
更新
Delphiのサンプルコードは次のとおりです。フォームを作成し、メモとタイマーをその上にドロップするだけです。 WinXPでテスト済み。
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.
チェックアウト GetPerformanceInfo() 。コミット数をキックバックします。