В последние дни я видел что-то странное в распределении памяти Delphi при работе с большим количеством элементов в списке.
Мой компьютер имеет 12 ГБ оперативной памяти;когда я запускаю свое приложение в 64-битном режиме (хранение данных в списке, элементы большого объема), я вижу, что используемая моим компьютером память медленно увеличивается на 10 ГБ и через короткое время уменьшается, пока использование не падает почти до 8 МБ (нормальноразмер приложения при запуске в памяти).Я подумал: если я храню данные в памяти, размер используемой памяти не должен быть таким же?Потому что почему тогда использование памяти уменьшается с 8 МБ до 10 ГБ и уменьшается до 8 МБ, когда каждый большой объем данных сохраняется в памяти и не очищается?
Это нормально?Спасибо за любые предложения.
ОБНОВЛЕНИЕ
Я сообщаю полный код, где возможно воспроизвести о том, что я сказал ранее.
program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses
PsApi, windows, System.SysUtils, System.Generics.Collections;
type
TMyRecord = record
x: Integer;
y: Integer;
end;
TMyArr = array of TMyRecord;
TMyList = TList<TMyArr>;
function CurrentMemoryUsage: Cardinal;
var
pmc: TProcessMemoryCounters;
begin
pmc.cb := SizeOf(pmc);
if GetProcessMemoryInfo(GetCurrentProcess, @pmc, SizeOf(pmc)) then
Result := pmc.WorkingSetSize
else
RaiseLastOSError;
end;
var
MyArr: TMyArr;
MyList: TMyList;
iIndex1, iIndex2: Integer;
iMax: Int64;
begin
try
{ TODO -oUser -cConsole Main : Insert code here }
iMax := Low(Int64);
Writeln(FormatFloat('Memory used before to create list: ,.# K',
CurrentMemoryUsage / 1024));
MyList := TMyList.Create;
try
Writeln(FormatFloat('Memory used before load item in list: ,.# K',
CurrentMemoryUsage / 1024));
for iIndex1 := 0 to 20000000 do
begin
SetLength(MyArr, 100);
for iIndex2 := 0 to High(MyArr) do
with MyArr[iIndex2] do
begin
x := iIndex2 + 1;
y := iIndex2 - 1;
end;
MyList.Add(MyArr);
if CurrentMemoryUsage > iMax then
iMax := CurrentMemoryUsage;
end;
Writeln(FormatFloat
('Memory used (max) during to load item in list: ,.# K', iMax / 1024));
Writeln(FormatFloat('Memory used to end load item in list: ,.# K',
CurrentMemoryUsage / 1024));
finally
MyList.Free;
end;
Writeln(FormatFloat('Memory used after destroyed list: ,.# K',
CurrentMemoryUsage / 1024));
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Readln;
end.
Как вывод яесть что-то так:
Memory used before to create list: 3.452 K
Memory used before load item in list: 3.504 K
Memory used (max) during load item in list: 4.194.300 K
Memory used to end load item in list: 2.789.020 K
Memory used after destroyed list: 2.976 K
В этом случае, где сказать «во время загрузки элемента в списке», я получаю почти 4 ГБ, но после того, как я закончил, чтобы загрузить элемент в списке памяти используется почти 2-3 Гб.Я пытался много симулировать, это изменение значения не является постоянной величиной, но в целом это значение учитывается.Повторюсь, для меня это не так важно.Был только для понимания больше о распределении памяти.