powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TObjectDictionary. Проблемы с памятью
11 сообщений из 11, страница 1 из 1
TObjectDictionary. Проблемы с памятью
    #39747492
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемые форумчане, решил дико юзать сей словарь и у меня возникло предположение, что память немножечко не чиститься.
Стандартными средствами FastMM ничего не находиться, так как при Free все чиститься,
а в процессе работы со словарем память немного растет.
Размер памяти я смотрел 3 способами:
1. диспетчер задач

2.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
function CheckSizeOP: Cardinal;
var
  pmc: PPROCESS_MEMORY_COUNTERS;
  cb: Integer;
  ppp: int64;
begin
  Result:= 0;

  cb := SizeOf(_PROCESS_MEMORY_COUNTERS);
  GetMem(pmc, cb);
  try
    pmc^.cb := cb;
    if GetProcessMemoryInfo(GetCurrentProcess(), pmc, cb) then
    Result:=round(pmc^.PagefileUsage/1048576);
  finally
    FreeMem(pmc);
  end;
end;



3.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
function MyGetAllocatedMemory: Cardinal;
var
  MemoryManagerState: TMemoryManagerState;
  K: Byte;
begin
  GetMemoryManagerState(MemoryManagerState);
  With MemoryManagerState do begin
    Result :=  TotalAllocatedLargeBlockSize + TotalAllocatedMediumBlockSize;
      For K := 0 to 54 do
        with SmallBlockTypeStates[K] do
          Result := Result + UseableBlockSize + InternalBlockSize + ReservedAddressSpace;
  end;
  Result := Result div 1024;
end;



Вот сам словарь

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
type
    TValueD = class (TObject)
      a1, a2, a3: uint32;
      b1, b2, b3: integer;
      d1, d2: TDateTime;
      constructor Create(...); overload;
  end;

  type
  TDic = TObjectDictionary <string, TValueD>;
  var
  Dic: TDic;



И работа с ним

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
procedure TForm1.Button1Click(Sender: TObject);
var
  i,ii, cnt: integer;
begin
   edit2.Text:= inttostr(strtoint(edit2.Text)+1);
   ii:= strtoint(edit2.Text);
   cnt:= strtoint(edit1.Text);
   for i := 1 to cnt do
   begin
     Dic.Add(ii.ToString+'-'+ i.ToString, TValueD.Create(now, now+2323, 111111111, 2222222222,
                  3333333333, 1234, 2345, 56789));
   end;
   label3.Caption:= 'Кол-во элементов: ' + dic.Count.ToString;
   label4.Caption:= 'Размер ОП: ' + CheckSizeOP.ToString;
   label5.Caption:= 'Другой ОП: ' + MyGetAllocatedMemory.ToString;
end;

procedure TForm1.Button2Click(Sender: TObject);
  var
  i, ii, cnt: integer;
begin
   cnt:= strtoint(edit1.Text);
   ii:= strtoint(edit2.Text);
   for i := 1 to cnt do
   begin
     Dic.remove(ii.ToString+'-'+ i.ToString);
   end;
   dic.TrimExcess;
   label3.Caption:= 'Кол-во элементов: ' + dic.Count.ToString;
   label4.Caption:= 'Размер ОП: ' + CheckSizeOP.ToString;
   label5.Caption:= 'Другой ОП: ' + MyGetAllocatedMemory.ToString;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Dic.Free;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Dic:= TDic.Create([doOwnsValues]);
end;



Провел небольшой тест (описание шага, диспетчер задач, Размер ОП, Другой ОП)
0. Начало 3 172 3 822
1. Добавил 5 млн (button1) 569 324 кБ 557 567706
2. Удалил 2 млн (button2) 335 388 кБ 329 331686
3. Добавил 3 млн (button1) 663 352 кБ 649 661589
4. Удалил 6 млн (button1) 4 436 8 851


Откуда разница?
...
Рейтинг: 0 / 0
TObjectDictionary. Проблемы с памятью
    #39747493
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbОткуда разница?
FastMM не обязан возвращать всю занятую у ОС память обратно до завершения работы приложения.
...
Рейтинг: 0 / 0
TObjectDictionary. Проблемы с памятью
    #39747495
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Провел небольшой тест
описание шага диспетчер задач Размер ОП Другой ОП0. Начало 3 172 3 822 1. Добавил 5 млн (button1) 569 324 кБ 557 5677062. Удалил 2 млн (button2) 335 388 кБ 329 3316863. Добавил 3 млн (button1) 663 352 кБ 649 6615894. Удалил 6 млн (button2) 4 436 8 851
...
Рейтинг: 0 / 0
TObjectDictionary. Проблемы с памятью
    #39747497
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp, FastMM я использую в качестве поиска утечек выставляя ReportMemoryLeaksOnShowdown:= True
...
Рейтинг: 0 / 0
TObjectDictionary. Проблемы с памятью
    #39747503
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbПровел небольшой тест
Для чистоты эксперимента ещё на Clear и Free сделай кнопки.
cptngrbalekcvp, FastMM я использую в качестве поиска утечек выставляя ReportMemoryLeaksOnShowdown:= True
Не суть, имелся в виду делфийский менеджер памяти в принципе.
...
Рейтинг: 0 / 0
TObjectDictionary. Проблемы с памятью
    #39747533
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp, Clear и Free ситуацию не изменили
...
Рейтинг: 0 / 0
TObjectDictionary. Проблемы с памятью
    #39747573
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbОткуда разница?
У менеджера памяти свои внутренние пулы, он их не обязан освобождать. Они будут освобождены при завершении приложения. Такие одноразовые замеры ничего не показывают, утечку нужно смотреть в динамике, на продолжительном временном отрезке.
...
Рейтинг: 0 / 0
TObjectDictionary. Проблемы с памятью
    #39747576
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...да, опрашивая непосредственно менеджер (твой третий способ) утечку зафиксировать можно.
...
Рейтинг: 0 / 0
TObjectDictionary. Проблемы с памятью
    #39747601
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо эти buttonclick закольцевать и поставить хотя бы на часик молотиться. Вот тогда уже и смотреть утечки
...
Рейтинг: 0 / 0
TObjectDictionary. Проблемы с памятью
    #39747627
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb,

Кстати, сдаётся мне, что тут у вас ошибка:
Код: pascal
1.
2.
with SmallBlockTypeStates[K] do
  Result := Result + UseableBlockSize + InternalBlockSize + ReservedAddressSpace;

http://docwiki.embarcadero.com/Libraries/Berlin/en/System.TSmallBlockTypeState
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  TSmallBlockTypeState = packed record
    {The internal size of the block type}
    InternalBlockSize: Cardinal;
    {Useable block size: The number of non-reserved bytes inside the block.}
    UseableBlockSize: Cardinal;
    {The number of allocated blocks}
    AllocatedBlockCount: NativeUInt;
    {The total address space reserved for this block type (both allocated and free blocks)}
    ReservedAddressSpace: NativeUInt;
  end;

Т.е. надо суммировать только ReservedAddressSpace, а не все 3.
...
Рейтинг: 0 / 0
TObjectDictionary. Проблемы с памятью
    #39747999
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
потестил денёк, явных утечек не нашел, есть видимый небольшой прирост ОП, но постоянного роста нет. Видимо под себя выделяет сколько то и шуршит помаленьку
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TObjectDictionary. Проблемы с памятью
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]