Утечка памяти Thread

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Утечка памяти Thread

Сообщение EmeraldMan » 18.01.2012 21:41:18

ОС: Linux 64, FPC 2.4.4, Lazarus 0.9.32

Провел эксперимент на маленькой тестовой программе: в цикле создаются приостановленные потоки (Thread'ы), затем удаляются, а несколько Мб не освобождается.
По клику на первую кнопку:
Код: Выделить всё
for i := 0 to 999 do
    thr[i] := TThread1.Create(true); 

По клику на вторую
Код: Выделить всё
for i := 0 to 999 do begin
    thr[i].Free;
  end;   

в процедуре выполнения потока просто стоит a := 1 , он все равно приостановленным создается.
Открываю диспетчер и смотрю - по умолчанию прога занимает 5-6 мб в оперативке, нажимаю на первую кнопку, размер вырастает до 28 мб, нажимаю на вторую - падает до 12 мб. Затем с последующими разами объем стабильно возрастает на 2-3 мб.

Посоветуйте как корректно освобождать память в данном случае?
Аватара пользователя
EmeraldMan
постоялец
 
Сообщения: 149
Зарегистрирован: 16.10.2008 08:41:51
Откуда: Белгород

Re: Утечка памяти Thread

Сообщение Widowmaker » 18.01.2012 21:55:20

Вся занятая память не освобождается по первому требованию. Вот тут http://www.freepascal.ru/forum/viewtopic.php?f=23&t=7329 кое-что об этом было. Если программу закрыть, то через некоторое время память освободится. Возможно, ещё неплохо было бы после free принудительно обнулять указатель: thr[i] := nil.
Аватара пользователя
Widowmaker
новенький
 
Сообщения: 37
Зарегистрирован: 27.04.2011 18:32:04

Re: Утечка памяти Thread

Сообщение Sergei I. Gorelkin » 18.01.2012 22:48:03

Linux 64, говоришь...
Попробуй все-таки давать потокам выполняться, если картина изменится в лучшую сторону - будет повод взглянуть на соответствующий кусок RTL повнимательнее.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Утечка памяти Thread

Сообщение EmeraldMan » 18.01.2012 23:43:19

Widowmaker, спасибо, довольно интересный топик. thr[i] := nil или FreeAndNil не помогают. Если программу закрыть память освобождается сразу, но интересует освободится ли память по прошествии определенного времени (как высказывается мнение в топике) если программа будет работать далее.

Сергей, действительно помогло! Причем не важно ставить FreeOnTerminate или самому делать Free по завершению, память так не накапливается когда потоки отрабатывают.
Первая хорошая ситуация:
Код: Выделить всё
for i := 0 to 999 do begin
   thr[i] := TThread1.Create(true);
   thr[i].FreeOnTerminate:=true;
   thr[i].Resume;
end;

Вторая хорошая ситуация:
Код: Выделить всё
//Первая кнопка:
for i := 0 to 999 do thr[i] := TThread1.Create(false);
//Вторая кнопка
for i := 0 to 999 do thr[i].free; 

Однако есть ситуация когда накопление в памяти всеже идет:
Код: Выделить всё
//Первая кнопка
for i := 0 to 999 do begin
    thr[i] := TThread1.Create(true);
    thr[i].FreeOnTerminate:=true;
end;
//вторая кнопка
for i := 0 to 999 do thr[i].Resume; //память освобождается, но не полностью (т.е. так же ведет себя как в первом сообщении)
Аватара пользователя
EmeraldMan
постоялец
 
Сообщения: 149
Зарегистрирован: 16.10.2008 08:41:51
Откуда: Белгород

Re: Утечка памяти Thread

Сообщение Widowmaker » 19.01.2012 00:30:22

Натыкался примерно на такой эффект, когда экспериментировал с большой типа коллекцией объектов (система была 32-разрядная). В памяти порождалось ~5200 разновеликих объектов, по ходу дела некоторые уничтожались, взамен порождались новые, но число их было примерно постоянным, как выше. Расход памяти был ~15-20 мб. Тоже как-то раз возникли сомнения, что программа забранную память честно отдаёт обратно. Насколько помню, для проверки рядом запускал gimp или imagej, загружал туда тяжёлое изображение, метров так на 5-6 в jpeg'e, и манипулировал с ним всяко разно. Потом закрывал графический редактор и видел, что память быстро возвращается к некоторому "равновесному" значению, т.е. подозрения в утечке исчезли. Наверное, и здесь что-то похожее - какая ему разница, выполнялись потоки или нет, если их всё равно ликвидировали? Просто придержал память на всякий случай. :)
Забыл ещё сказать - после того, как ливидировал ненужные объекты из массива obj_arr[] в цикле поодиночке, ликвидировал сам массив: if ( obj_arr <> nil ) then obj_arr := nil.
Аватара пользователя
Widowmaker
новенький
 
Сообщения: 37
Зарегистрирован: 27.04.2011 18:32:04

Re: Утечка памяти Thread

Сообщение Sergei I. Gorelkin » 19.01.2012 04:26:44

Конкретно с TThread все гораздо хуже тем, что течет не только память, но и всякие дескрипторы...
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Утечка памяти Thread

Сообщение GrayEddy » 19.01.2012 09:00:15

Хотелось бы уточнить:

1. Только под Linux 64?
2. С какой версии и разрядности FPC?
GrayEddy
постоялец
 
Сообщения: 375
Зарегистрирован: 06.05.2005 09:37:56

Re: Утечка памяти Thread

Сообщение Sergei I. Gorelkin » 19.01.2012 09:40:29

В свое время я исправил подобный баг для Windows: http://bugs.freepascal.org/view.php?id=17560
Тогда же проверял реализацию для Linux, в них вроде бы этого не наблюдалось. Может, плохо проверял, а может быть, тут происходит что-то другое.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Утечка памяти Thread

Сообщение EmeraldMan » 19.01.2012 10:32:03

Widowmaker писал(а):Наверное, и здесь что-то похожее - какая ему разница, выполнялись потоки или нет, если их всё равно ликвидировали? Просто придержал память на всякий случай. :)

Хорошо было бы, если так )

GrayEddy писал(а):Хотелось бы уточнить:
1. Только под Linux 64?
2. С какой версии и разрядности FPC?

1. На других, честно говоря, не проверял.
2. FPC 2.4.4, ставил 64 разрядную.

Sergei I. Gorelkin писал(а):В свое время я исправил подобный баг для Windows: http://bugs.freepascal.org/view.php?id=17560

из истории бага:
2011-12-01 10:12 Marco van de Voort Fixed in Version 2.5.1 => 2.6.0
видимо надо обновиться до более свежей версии и попробовать.
Аватара пользователя
EmeraldMan
постоялец
 
Сообщения: 149
Зарегистрирован: 16.10.2008 08:41:51
Откуда: Белгород


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru