Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Утечка пямяти 
:(
    Опции темы
lightforever
Дата 1.1.2011, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 4.9.2009

Репутация: нет
Всего: нет



Имеется очень простенький код:

 
Код

    static Bitmap get_new_bitmap()
        {
            return new Bitmap(1000, 1000);
        }
        static void Main(string[] args)
        {
         
            Bitmap bitmap = new Bitmap(1, 1);

            for (int i = 0; i < 10000; i++)
            {
                bitmap = get_new_bitmap();
            }
        }


Но при запуске получается сильная утечка памяти в get_new_bitmap() , т.к. он возвращать то возвращает мне Новый объект, однако почему-то сборщик мусора не хочет удалять старый Объект из памяти, который вернул мне в предыдущем вызове
get_new_bitmap(). Можно узнать почему? Как сделать, чтобы  удалялся старый объект?

Добавлено через 9 минут и 19 секунд
Как решить эту проблему я понял, достаточно принудительно заставить сборщик мусора произвести чистку:

Код

      System.GC.Collect();
       System.GC.WaitForPendingFinalizers();


Но остаётся вопрос: я всегда думал, что сборщик мусора обязан сам производить чистку в этой ситуации. Почему он этого не делает?
   


PM MAIL   Вверх
CYBERDREAM
Дата 1.1.2011, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: 11
Всего: 28



У меня все без проблем. 
Попробуй 
Код

for (int i = 0; i < 10000; i++)
            {
                bitmap.Dispose();
                bitmap = get_new_bitmap();
            }



--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
KelTron
Дата 2.1.2011, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 9
Всего: 38



Цитата(lightforever @  1.1.2011,  16:45 Найти цитируемый пост)
Но остаётся вопрос: я всегда думал, что сборщик мусора обязан сам производить чистку в этой ситуации. Почему он этого не делает?

Он производит очистку, но только когда сам посчитает это нужным, и он совершенно не обязан чистить объект сразу же как только тот стал мусором..

Цитата(lightforever @  1.1.2011,  16:45 Найти цитируемый пост)
Как решить эту проблему я понял, достаточно принудительно заставить сборщик мусора произвести чистку:

Это не решение "проблемы", т.к. проблемы нет. Это, наоборот, потенциальное добавление проблем. Вызывать GC ручками нужно только в крайних случаях, например, при работе с COM объектами.

Есть очень хорошее правило, при работе с управляемой памятью: "выделил и забыл".



--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
Любитель
Дата 3.1.2011, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 11
Всего: 92



Читаем про IDisposable и оператор using.


--------------------
PM MAIL ICQ Skype   Вверх
МастерФломастер
Дата 11.4.2011, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 17.7.2008

Репутация: нет
Всего: нет



Тоже столкнулся с утечкой памяти, имею в чужом, большом проекте такую конструкцию:

Код

void Save()
{
obj = null;
obj = new ObjClass();
}


Проблема в том, что старый obj остается в памяти, несмотря на обнуление ссылки на него. Вообще проблема была обнаружена т.к. obj не "отписывался" от событий, на которые подписан и продолжал делать свою работу вместе с новым экземпляром. Я то конечно отписал его от событий, пользователь косяков больше не видит, но после небольшого теста - запуска цикла всего лишь с 10 save'ми - свободной памяти стало на 230мб меньше smile   Погуглив, решил что лучшее решение - реализовать метод Dispose(). Но! Надо сказать obj - очень сложный, большой объект, который включает в себя много других больших, сложных объектов, которые... и так далее. Таких классов порядка 500. Значит, для каждого надо реализовать Dispose(). Что делать мягко говоря не хочется, по крайней мере пока, т.к. только начинаю разбираться с проектом.

есть ли способ удалить obj попроще, не переписывая весь проект?

для спокойствия моей совести было бы достаточно, если бы сборщик мусора когда-нибудь очистил память, только сдается мне никогда этого не случится
простенький пример, как мне кажется аналогичный моему случаю :
Код

public partial class Form1 : Form
{
    private Form f;

    public Form1()
    {
        InitializeComponent();
        button1.Click += new EventHandler(button1_Click);
    }

    void button1_Click(object sender, EventArgs e)
    {
        if (f != null)
        {
            //f.Dispose(); //1й вариант работает замечательно, старая форма удаляетя

            f = null;      //2й вариант - форма остается
            GC.Collect();  //и даже принудительная сборка мусора не помогает
        }
        f = new Form1();
        f.Show();
    }
}


При втором варианте - формы плодятся, старые не исчезают, я наивно полагал что все ссылки на форму удалил и она удалится сборщиком мусора. Почему не удаляется? И что надо сделать чтобы сборщик мусора ее удалил сам (без помощи Dispose).

Ещё один вопрос родился: можно ли получить все ссылки на заданный объект? Может в процессе отладки можно?

Это сообщение отредактировал(а) МастерФломастер - 11.4.2011, 16:36
PM MAIL   Вверх
bend0r
Дата 11.4.2011, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 14.9.2005

Репутация: 1
Всего: 2



Если ссылки обнулены то никакой утечки не будет. для потенциально больших обьектов типа Bitmap сделан Dispose

Это сообщение отредактировал(а) bend0r - 11.4.2011, 14:50
PM MAIL   Вверх
МастерФломастер
Дата 11.4.2011, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 17.7.2008

Репутация: нет
Всего: нет



хм.. ну у меня утечка есть - факт. Вероятно, потому что, не все ссылки обнуляются, например большинство дочерних объектов ссылаются на родителя. Как найти и обнулить ВСЕ ссылки для меня вопрос открытый.

И прокомментируйте, пожалуйста, пример с формами, там вот тоже ссылка вроде как обнуляется, а толку нет.

Это сообщение отредактировал(а) МастерФломастер - 11.4.2011, 16:34
PM MAIL   Вверх
neutrino
Дата 11.4.2011, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: 3
Всего: 62



Kомпилятор оптимизирует твой код и просто выкидывает f=null;
Попробуй написать f.Dispose. Или как-нибудь использовать f:

f=null;
if (f!=null) Console.Write("Something fucked up definitely!");


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
МастерФломастер
Дата 11.4.2011, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 17.7.2008

Репутация: нет
Всего: нет



уфффф


f=null;
if (f!=null)  - не выполнится никогда!

ссылка обнуляется, ниче компилятор не выкидывает!  Вы запустите пример у себя. Сначала первый вариант, затем второй. Почуствуйте разницу! с каждым кликом появляется новая форма, a старые остаются.

в случае с формой Dispose - превосходный выход, но у меня в проекте ни один класс не имеет такого метода.  Поэтому я пытаюсь найти способ удалить таки этот объект.


PM MAIL   Вверх
Экскалупатор
Дата 11.4.2011, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 11
Всего: 24



Цитата(МастерФломастер @  11.4.2011,  16:32 Найти цитируемый пост)
в случае с формой Dispose - превосходный выход, но у меня в проекте ни один класс не имеет такого метода.

ну так реализуй его, он определен в интерфейсе IDisposeble, наследуй и пиши.

кстати, где то читал что с делегатами у GC косяк. т.е. если класс ClassA, подписывается на событие в другом классе ClassB(ессно используя для этого делегаты), то даже если экземпляр ClassB уже не существует, то все равно экземпляр ClassA остается, потому что ожидает события и GC не считает необходимым его удалять. как то так вроде...
PM MAIL ICQ   Вверх
gambit
Дата 12.4.2011, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***
Награды: 1



Профиль
Группа: Комодератор
Сообщений: 1359
Регистрация: 25.6.2006
Где: я?

Репутация: 5
Всего: 40



Цитата(lightforever @  1.1.2011,  16:45 Найти цитируемый пост)
Как решить эту проблему я понял, достаточно принудительно заставить сборщик мусора произвести чистку:

самой кривейший вариант. Если бы у меня на проекте кто ниб вызовет GC сам - тут же уволю нахрен. (Естественно ситуации возможны разные, но надо настолько обосновать, что проще плюнуть и не писать))) Я за свою жисть ни разу не встречал необходимости ручного сбора мусора, а вот заметок типа "не трогайте этот рычаг" очень много где видел, в том числе и в так излюбленном всеми Рихтере.
PM MAIL ICQ Skype   Вверх
bend0r
Дата 12.4.2011, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 14.9.2005

Репутация: 1
Всего: 2



Цитата(МастерФломастер @ 11.4.2011,  16:31)
хм.. ну у меня утечка есть - факт. Вероятно, потому что, не все ссылки обнуляются, например большинство дочерних объектов ссылаются на родителя. Как найти и обнулить ВСЕ ссылки для меня вопрос открытый.

И прокомментируйте, пожалуйста, пример с формами, там вот тоже ссылка вроде как обнуляется, а толку нет.

утечки памяти в моем понимание тут нету. то что сборщик не выполняется сразу после обнуления ссылок это логично, процедура эта относительно ресурсоемкая ...
если приложения постоянно создает большое количество больших обьектов, при этом каждый раз в новых адресах памяти, то тут проблема либо в архитектуре либо в реализации самого приложения
PM MAIL   Вверх
gambit
Дата 12.4.2011, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***
Награды: 1



Профиль
Группа: Комодератор
Сообщений: 1359
Регистрация: 25.6.2006
Где: я?

Репутация: 5
Всего: 40



Цитата(bend0r @  12.4.2011,  14:57 Найти цитируемый пост)
утечки памяти в моем понимание тут нету. то что сборщик не выполняется сразу после обнуления ссылок это логично

кстати мой эмоциональный предыдущий высер затмил этот главный факт - почитайте в каких случаях и как вызывается сборщик мусора, про поколения и общие принципы работы, и тогда вы поймете почему он не отрабатывает сразу.
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1352 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.