Windows Server 2008(x64、sp1)で実行すると、メモリフットプリントが着実に増加するD2007アプリケーションがあります。
Windows Server 2003(x32またはx64)、XPなどで正常に動作し、期待どおりに上下します。
付属のメモリマネージャまたは最新のFastMM44.92で試してみたところ、同じ結果が得られました。
Win2008でDelphiアプリのメモリ使用量を監視しようとした人はいますか?
または何か手がかりがありますか?
精度:
-常識的なメモリリークはありません(もちろん、私はFastMMなどに精通しています)
-メモリ使用量はProcessExplorerで監視されました。Win2008では、仮想メモリ(Private Bytes)と物理メモリ(WorkingSet Private)の両方が増加しています。メモリの
負荷がかかっていても、メモリ消費量は増加し続けていました。(それが失敗を引き起こしたので、私たちが調査するようになった方法ですが、Win2008ボックスでのみ)
更新://**リペース**//コードはアプリよりもはるかに単純ですが、同じ動作を示します。
10,000,000個のオブジェクトと10,000,000個のインターフェイスのリストを作成し、2回実行すると、使用メモリが最大60 MB増加し、Windows Server 2008でさらに100回実行すると、約300 MB増加しますが、XPの場合の状態に戻ります。
複数のインスタンスを起動した場合、他のインスタンスを実行できるようにメモリが解放されません。代わりに、ページファイルが大きくなり、サーバーがクロールします...
アップデート2:QCレポート73347
を参照してください。
さらに調査した後、以下のコードに示すように、クリティカルセクションまで追跡しました。
そのコードをボタン付きの単純なVCLアプリケーションに配置します。そして、ProcessExplorerで監視し
ます。開始は約2.6MBで、5回の実行(ボタンをクリック)後も約118.6MBのままです。
5回の実行で116MBが失われました。
//***********************
const
CS_NUMBER = 10000000;
type
TCSArray = Array[1..CS_NUMBER] of TRTLCriticalSection;
PCSArray = ^TCSArray;
procedure TestStatic;
var
csArray: PCSArray;
idx: Integer;
begin
New(csArray);
for idx := 1 to length(csArray^) do
InitializeCriticalSection(csArray^[idx]);
for idx := 1 to length(csArray^) do
DeleteCriticalSection(csArray^[idx]);
Dispose(csArray);
end;
procedure TestDynamic(const Number: Integer);
var
csArray: array of TRTLCriticalSection;
idx: Integer;
begin
SetLength(csArray, Number);
for idx := Low(csArray) to High(csArray) do
InitializeCriticalSection(csArray[idx]);
for idx := Low(csArray) to High(csArray) do
DeleteCriticalSection(csArray[idx]);
end;
procedure TForm4.Button1Click(Sender: TObject);
begin
ReportMemoryLeaksOnShutdown := True;
TestStatic;
TestDynamic(CS_NUMBER);
end;