Russian Qt Forum

Qt => Общие вопросы => Тема начата: merke от Июль 19, 2013, 13:52



Название: AHTUNG!!! Утечка
Отправлено: merke от Июль 19, 2013, 13:52
Всем здрасти!

Может кто сталкивался с подобной проблемой.

Есть структурка:

Код:
mySt
{
 QByteArray a;
 QByteArray b;
};

Есть список данных структур:
Код:
QList<mySt> lstSt;

Есть функция, которая заполняет этот список данными.

Так вот, если наполнить этот список данными и попробовать его очистить допустим в деструкторе, то память не освобождается, а вот если этот список чистить в самой функцие где и производилось его заполнение, то память успешно освобождается. Мистика прям. Почему если покинуть функцию где наполнялся список, невозможно в дальнейшем освободить память занимаемая им.



Название: Re: AHTUNG!!! Утечка
Отправлено: Alex Custov от Июль 19, 2013, 14:11
Откуда ты узнаёшь, что память не освобождается?


Название: Re: AHTUNG!!! Утечка
Отправлено: merke от Июль 19, 2013, 14:21
Смотрю на резидентную память по htop


Название: Re: AHTUNG!!! Утечка
Отправлено: Alex Custov от Июль 19, 2013, 14:25
Смотрю на резидентную память по htop

Освобождаемость памяти нужно проверять по деструкторам. Добавь в структуру деструктор и в нём debug сообщение - как пить дать оно будет показываться.


Название: Re: AHTUNG!!! Утечка
Отправлено: merke от Июль 19, 2013, 14:27
Это уже сделано, деструктор чистит все, но по htop память остается. Вычитал, что QList может только разрастаться, но сужаться уже ни как. Вопрос теперь, а как же эту гадость удалить теперь? почистить?


Название: Re: AHTUNG!!! Утечка
Отправлено: Bepec от Июль 19, 2013, 14:47
Версия Qt? ОС?

List спокойно чистится и ничего не оставляет. Приведите цифры пожалуйста, например
Цитировать
Список в __ млн QByteArray("тест").
Сожрало __ гигабайт.
После удаления списка осталось занято __ гигабайт.
Через минуту ситуация изменилась/осталась прежней/память возросла на __ / память уменьшилась до __, нужное подчеркнуть.


Название: Re: AHTUNG!!! Утечка
Отправлено: Old от Июль 19, 2013, 14:51
Это уже сделано, деструктор чистит все, но по htop память остается.
Правильно, эта память остается за процессом и он может ее использовать по своему усмотрению. Уже 100500 раз обсуждалось.

Вычитал, что QList может только разрастаться, но сужаться уже ни как.
Бред.

Вопрос теперь, а как же эту гадость удалить теперь? почистить?
Все удаляется и ничего чистить не надо. Если вашему процессу понадобиться память, то она не будет запрашиваться у ОС, а будет использоваться уже распределенная.


Название: Re: AHTUNG!!! Утечка
Отправлено: Igors от Июль 19, 2013, 16:47
Правильно, эта память остается за процессом и он может ее использовать по своему усмотрению. Уже 100500 раз обсуждалось.
Много раз слышал эту легенду, но не знаю ни одного места где Qt держало бы "резерв памяти".

QList::clear() освобождает все (по крайней мере начиная с версии 4.7). Др дело если распределили напр 1 миллион элементов, а потом удалили и оставили всего 1. Да, там хвостики останутся, но то же самое и std контейнерами 


Название: Re: AHTUNG!!! Утечка
Отправлено: Old от Июль 19, 2013, 16:51
Много раз слышал эту легенду, но не знаю ни одного места где Qt держало бы "резерв памяти".
Причем здесь Qt и какой резерв памяти?


Название: Re: AHTUNG!!! Утечка
Отправлено: Bepec от Июль 19, 2013, 17:08
Igors вот тут вы в роли незнающего. :)

Это режим взаимодействия ОС и процесса. Можете почитать.


Название: Re: AHTUNG!!! Утечка
Отправлено: merke от Июль 19, 2013, 18:16
Вообщем проделал я следующий эксперимент.

Взял два QList'а, первый заполнил 10-тью мегабайтами, т.е. 10 элементов, каждый по 1 мб. Взял его зачистил при помощи метода clear(), по htop, как было занято 10 мб, так и осталось. Далее начал во второй QList добавлять по 1 мб, 10 таких добавлений не изменили размер процесса в памяти, а вот уже 11 итерация прибавила 1 мб к памяти процесса. Вывод следующий: ядро Linux резервирует память под процесс. Не ясно следующее, почему если в той же самой функции где шло заполнение контейнера, сразу для него вызвать clear(), то память освободится, а вот если уже допустим в деструкторе чистить, то память не освобождается. Догадки следующие: ядро считает, что если я в функции занял определенный участок памяти и тут же его удаляю, то нужно этот участок памяти оставить системе, а вот если уже создал и дальше работаю с ней, то и в будущем моему процессу понадобится такой вот участок памяти, банально, но фиг знает может так и есть.

Пробовал также у самого QList'а "пропатчить" метод reserve(), а именно комментил условие, что если пытаются зарезирвировать меньшее число чем сейчас есть, то не делать реалок памяти, я думал, что если так сделаю, то смогу при отчистке сделать просто reserve(0) моему контейнеру, а в итоге шиш, что еще раз подтверждает тот факт, что ядро линукса оставляет память за процессом.


Название: Re: AHTUNG!!! Утечка
Отправлено: Alex Custov от Июль 19, 2013, 18:42
эта память может быть занята другим приложением по первому требованию.


Название: Re: AHTUNG!!! Утечка
Отправлено: merke от Июль 20, 2013, 08:12
А этот процесс как нибудь контролируем допустим посредством API. Чтобы принудительно отдать память системе?


Название: Re: AHTUNG!!! Утечка
Отправлено: Bepec от Июль 20, 2013, 09:12
Нееет :) Хотя в линуксе всё может быть :D


Название: Re: AHTUNG!!! Утечка
Отправлено: Igors от Июль 20, 2013, 09:36
Вообщем проделал я следующий эксперимент.
На Mac OSX (linuх posix) штатная утилита Activity Monitor четко показывает что clear() все отдает. А что там делает та или иная версия Linuх - ее личное дело, повлиять на это все равно нельзя (на уровне прикладной программы). В общем, как в том анекдоте "это просто трусы линяют"  :)


Название: Re: AHTUNG!!! Утечка
Отправлено: Old от Июль 20, 2013, 09:42
На Mac OSX (linuх posix) штатная утилита Activity Monitor четко показывает что clear() все отдает. А что там делает та или иная версия Linuх - ее личное дело, повлиять на это все равно нельзя (на уровне прикладной программы). В общем, как в том анекдоте "это просто трусы линяют"  :)
Это почему?
Есть brk/sbrk, которой вы сможете регулировать размер распределенной памяти (и под MAC OSX, скорее всего, в том числе).
Только пока вы используете стандартный менеджер кучи, вам это вряд-ли понадобиться, ибо этим занимается он.


Название: Re: AHTUNG!!! Утечка
Отправлено: GreatSnake от Июль 20, 2013, 10:26
На Mac OSX (linuх posix) штатная утилита Activity Monitor четко показывает что clear() все отдает. А что там делает та или иная версия Linuх - ее личное дело, повлиять на это все равно нельзя (на уровне прикладной программы). В общем, как в том анекдоте "это просто трусы линяют"  :)
Версия Linux тут не причём, всё упирается в версию malloc. Везде они разные. Через LD_PRELOAD можно её легко подменить любому приложению (не статик, конечно).
Кстати, Mac OSX это надстройка над Darwin, которая к linuх не имеет никакого отношения, т.к. выросла из FreeBSD)


Название: Re: AHTUNG!!! Утечка
Отправлено: Igors от Июль 20, 2013, 11:18
Есть brk/sbrk, которой вы сможете регулировать размер распределенной памяти
Насколько я помню, эти старомодные ф-ции меняют размер сегмента данных, а не кучи.

Версия Linux тут не причём, всё упирается в версию malloc. Везде они разные. Через LD_PRELOAD можно её легко подменить любому приложению (не статик, конечно).
Пусть так, и что прикладная прога может реально предпринять? Изменить механизм страниц - нет. Написать свой менеджер кучи - явно неуместный велосипед. Что еще?

Кстати, Mac OSX это надстройка над Darwin, которая к linuх не имеет никакого отношения, т.к. выросла из FreeBSD)
Linuх, FreeBSD, Darwin - во всяком случае одно "nix" семейство. Возвращаясь к теме - ответ тот же - оставить как есть и полагаться на ОС


Название: Re: AHTUNG!!! Утечка
Отправлено: Old от Июль 20, 2013, 11:20
Насколько я помню, эти старомодные ф-ции меняют размер сегмента данных, а не кучи.
Вы не правильно помните. :)
Это не две функции, один из них - системный вызов, который дергается вашим менеджером памяти прямо сейчас, когда вы читаете это сообщение.

Написать свой менеджер кучи - явно неуместный велосипед. Что еще?
Это для вас он не уместный и я даже знаю почему, это не FindReplace для std::string написать. :)


Название: Re: AHTUNG!!! Утечка
Отправлено: Igors от Июль 20, 2013, 12:07
Это для вас он не уместный и я даже знаю почему,
Ну так если для Вас уместный - реализуйте и выкладывайте здесь, обсудим  :)


Название: Re: AHTUNG!!! Утечка
Отправлено: GreatSnake от Июль 20, 2013, 12:25
Пусть так, и что прикладная прога может реально предпринять? Изменить механизм страниц - нет. Написать свой менеджер кучи - явно неуместный велосипед. Что еще?
Воспользоваться сторонним МП (менеджер памяти), благо их хватает.

Цитировать
Возвращаясь к теме - ответ тот же - оставить как есть и полагаться на ОС
Опять-двадцать пять...
Причём здесь ОС, если МП по сути является частью приложения?


Название: Re: AHTUNG!!! Утечка
Отправлено: merke от Июль 20, 2013, 12:53
Практически тоже самое наблюдал сейчас под Windows. При старте приложухи по диспетчеру задач она заняла 8 мб памяти. После работы и очистки памяти был всплеск до 27 мб, но сбросилось до 10 мб по окончанию, получается куда то делись 2 мб памяти, неужели винда ведет себя также как Linux. Чтобы выяснить это - решил сделать следующий эксперимент: запустил первый процесс при запуске также 8 мб, после работы 10 мб. Начал запускать еще копии таких же приложух, пока не забил всю свободную оперативную память и в тот момент когда уже начал лезть в своп, начал наблюдать завораживающую взгляд картину, первый процесс стал "худеть", сначала сбросил с 10 мб до 7 мб, а потом и вовсе до 2,5 мб. Вуаля, вывод: реально мое тестовое приложение занимает в оперативе 2,5 мб все остальное место он себе натырил как бобер за щеки - на будущее, а как системе стало не хватать оперативы, она начала забирать резервированную память у процессов. Вот такая вот интересная картина получается...


Название: Re: AHTUNG!!! Утечка
Отправлено: Old от Июль 20, 2013, 13:21
Ну так если для Вас уместный - реализуйте и выкладывайте здесь, обсудим  :)
А что в этом вопросе с вами можно обсудить? Вы же понятия не имеете о чем идет речь:

Насколько я помню, эти старомодные ф-ции меняют размер сегмента данных, а не кучи.

 ;D