Не освобождается память. freebsd 7.1 gcc C

Тема в разделе "WASM.UNIX", создана пользователем Xerx, 10 апр 2010.

  1. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Пишу приложение для FreeBSD на C с компилятором gcc. Возникла проблема с не освобождающейся памятью. free(malloc(...)) не отдает память системе.
    Тут http://c-faq.com/malloc/freetoOS.html нашел следующее:
    Что-то в этом есть, но когда прога отъедает несколько гигабайт оперативки при этом оперируя всего несколькими мегабайтами это лично мне действует на нервы :)

    Есть ли возможно действительно вернуть память системе? Программа разрабатывается конкретно под указанную линейку (7.1 ia64), так что приму частные решения для данной системы.

    Решения со "своим менеджером памяти" не пойдут - все равно надо память возвращать.

    Заранее спасибо.
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Откуда мнение, что не отдаёт?

    В линукс оппортунистическое выделение памяти - физическая память резервируется при первом обращении.
     
  3. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    top, ps и free говорят о постоянном увеличении потребляемой программой памяти.
    Дошло до того, что во всех местах выделения и освобождения памяти добавил счетчик выделенной памяти. Он не показывает утечек.
     
  4. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Про "lazy allocating" в курсе, да и выделямая память используется сразу после выделения.
     
  5. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Можно минимальный кусок кода?
     
  6. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Увы, до понедельника никак. С работы смогу тут выложить куски кода.
    Просто особо интересна приведенная мною фраза о не возвращаемой libc памяти в систему, о повторном ее возможном использовании в будущем. Как-то слишком самовольно поступает.
     
  7. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Без кода что-либо сказать сложно, у меня на лялихе от free(malloc(...)) расход памяти не растёт.
     
  8. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Тогда в понедельник выложу кода немного.
     
  9. black_hole

    black_hole New Member

    Публикаций:
    0
    Регистрация:
    3 янв 2006
    Сообщения:
    44
    тоже самое, освобождает сразу после free() на amd64 linux, если бы не освобождало то аппликуха бы загнулась в свопе, а так calloc,malloc,realloc,free держат в тонусе...
     
  10. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    Xerx
    Написать свой хип для больших объектов. Или для всех объектов вообще. Для всех объектов вообще можно на cbreak'е это сделать, но libc может неявно пользоватся malloc/free в некоторых ситуациях. Если же миксовать cbreak с malloc/free, то я затрудняюсь сказать можно ли как-то не убить libc'овый хип. А можно использовать mmap на /dev/null, тут уж я думаю без проблем можно будет использовать и malloc/free для множественных выделений, и самостоятельно выделять/освобождать память под большие объекты.

    Но вообще, мне чего-то не нравится проблема. С фрёй я мало работал, но... Но в ней же крутится весь тот софт, который работает в линухе. И у него проблем не возникает. Думается мне, что ты что-то не так делаешь.
    Возьми mem-leak детектор, зачем изобретать велосипед? Засунь в valgrind, например, тот пишет про мемлики.
     
  11. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    Хы. А я думаю чего это форум так надолго задумался, когда я на кнопку "отправить" нажал. А он оказывается два сообщения сразу добавлял.
     
  12. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Проблема оказалась в другом и вообще не связано с оперативкой напрямую :)

    В процессе работы создается много потоков через pthread_create. При этом память и растет. Вызов pthread_detach() решил проблему. Вот такие дела...
     
  13. black_hole

    black_hole New Member

    Публикаций:
    0
    Регистрация:
    3 янв 2006
    Сообщения:
    44
    Эхх,зато как логично выглядела проблема вместе в выдержкой из howto :-D