Страница 1 из 2

не высвобождается память

Добавлено: 05 мар 2007, 01:00
Golova
делаю простой тест:
выделяю блоки памяти в цикле
что бы процессор не грузило, делаю sleep.
потом удаляю выделеные блоки памяти.
Но линукс отказывается особождать занятую память, которую например показывает TOP: VIRT, %MEM
т.е. я видел при выделении маскимум на этих счетчиках, напрмер VIRT = 200мб, %MEM = 20 и после удаления памяти эти счетчики остаются неизменными.
под виндой таже программа работает корректно.
всего бы ничего но если выделять больше памяти то система тормозит невероятно - просто вешается (когда кончается оперативная и swap)

Добавлено: 05 мар 2007, 16:51
fa3a
Golova, а как именно ты выдыляешь память и удаляешь ее? код покажи плиз..

Добавлено: 05 мар 2007, 17:25
Victor Gr.
Кажется, именно по этой причине Firefox жрёт столько памяти. Где-то я читал, что glibc имеет такое свойство.

Добавлено: 05 мар 2007, 18:06
Golova
std::queue<int> q;
int cnt = 0;
while(cnt < 100000) {
for(int i=0;i<100;i++){
SampleClass *p = new SampleClass(param);
usleep(10*1000)
q.push((int)p);
cnt++;
}
ATSL::sleep(10);
}

while(!q.empty()) {
int p = q.front();
q.pop();
delete ((SampleClass*) p);
};

Добавлено: 05 мар 2007, 18:10
Golova
динамическая память в SampleClass не выделятся, используются только базовые типы

Добавлено: 06 мар 2007, 11:13
myst
Ну дык, не отдаёт libc/libc++ память системе, не отдаёт. Мало ли, а ты опять зохавать памяти захочешь? Если туда сюда её гонять постоянно, то это ж какие overheads будут!

Добавлено: 06 мар 2007, 17:49
Victor Gr.
myst, а што, зусім бяз вольнай памяці ў сістэме, лепей?

А FreeBSD libc/c++ аддае памяць?

Добавлено: 06 мар 2007, 19:04
Llama
Victor Gr., существует костыль в виде отдельного _кажется_ malloc из openpsd который подкручивается к firefox путем LD_PRELOAD, так что видимо как-то оно иначе работает....

Добавлено: 07 мар 2007, 01:05
Golova
Короче, не могу найти каких либо рычагов воздействия на менеджер памяти, что бы он так не безобразничал.
Может кто знает как можно принудительно вернуть системе ранее освобожденную память ?

Добавлено: 07 мар 2007, 09:27
myst
Victor Gr. писал(а):myst, а што, зусім бяз вольнай памяці ў сістэме, лепей?
Нет серебрянной пули. Если памяти не хватает *BSD прибивает самый прожорливый процесс.
Victor Gr. писал(а):А FreeBSD libc/c++ аддае памяць?
Отадёт память только OpenBSD, насколько мне известно, возможно и NetBSD, но не уверен. FreeBSD память не отдаёт.

Добавлено: 07 мар 2007, 12:45
Victor Gr.
Golova, перазапусьці працэс. Форк дык наўрадці дапамажэ.

myst, ну цікава... Лёгікі ніякай. Дык навошта тады free () рабіць?

Добавлено: 07 мар 2007, 17:28
Golova
Victor Gr., процесс очень похож на сервис по требованиям бесперебойной работы длительное время, так что вариант с перезапуском не проходит.

Добавлено: 07 мар 2007, 20:16
Foxx
попробуйте valgrind спросить, что он думает о реаллокации памяти
попробуйте libgc1c2, авось да поможет
пересмотрите необходимость хранения в памяти одновременно большого количества объектов класса
гадать что к чему можно долго

Добавлено: 07 мар 2007, 22:02
Victor Gr.
Aleksey Kondratenko, у меня Firefox 2 за двое суток непрерывной разработки сайта (частые обновления, много вкладок) вычерпывает 70% памяти, 521 Мб виртуальной.

При чём даже когда все вкладки закрываешь и оставляешь одну. Я знаю о проблеме FF с памятью, а точнее с её дикой фрагментацией у него, и о том, что glibc не отдаёт... Но, блин!, такими темпами недалеко и весь swap вычерпать и свалиться с out-of-mem.

Скрин: http://users.cosmostv.by/wiktar/ff.png

Добавлено: 07 мар 2007, 22:39
Llama
Victor Gr., полагаю flash из браузера выброшен? Ибо оно само по себе течет. Кроме того - погугли насчет openbsd malloc firefox LD_PRELOAD - у меня оно по крайней мере собиралось и не мешало грузится браузеру - авось тебе поможет.

PS: вот кстати исследование вопроса http://mr.himki.net/index-alloc.html