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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> утечка памяти 
:(
    Опции темы
uranpro
Дата 6.4.2010, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



голову сломал, не могу въехать  smile 
есть
Код

    [Serializable]
    public class CustomSerialization<T> : IDisposable
    {
        public MemoryStream GetMStream()
        {
            var stream = new MemoryStream();
            try
            {
                new BinaryFormatter().Serialize(stream, this);
                stream.Position = 0;
                return stream;
            }
            catch
            {
                stream.Close();
                throw;
            }
        }

        public static T GetObjectFromMStream(MemoryStream MStream)
        {
            return (T)new BinaryFormatter().Deserialize(MStream);
        }

        public virtual void Dispose() { }
    }

    [Serializable]
    public class MSTest : CustomSerialization<MSTest>
    {
        public MemoryStream stream { get; set; }

        public override void Dispose()
        {
            stream.Close();
        }
    }

    public static class CopyStream
    {
        public static void Copy(Stream streamIn, Stream streamOut)
        {
            byte[] buffer = new byte[2000];
            int len;
            while ((len = streamIn.Read(buffer, 0, 2000)) > 0)
            {
                streamOut.Write(buffer, 0, len);
            }
            streamOut.Flush();
        }
    }

делаю так
Код

        void AddMemoryInUse(string Msg)
        {
            AddResult(string.Format("Memory in use {0:D} KB, after {1}", GC.GetTotalMemory(false) / 1024, Msg));
        }

        public Form1()
        {
            InitializeComponent();

            AddMemoryInUse("start");

            var msg = new MSTest();

            AddMemoryInUse("msg create");

            var fs = new FileStream("C:\\Trio.avi", FileMode.Open); // весит 4мб
            AddMemoryInUse("fs open");
            msg.stream = new MemoryStream();
            CopyStream.Copy(fs, msg.stream);

            AddMemoryInUse("fs copy to msg.stream");
            
            fs.Close();
            
            AddMemoryInUse("fs.close");

            var ms2 = msg.GetMStream();

            AddMemoryInUse("ms2 = msg.GetMStream");

            msg.Dispose();

            AddMemoryInUse("msg.dispose");

            var msg2 = MSTest.GetObjectFromMStream(ms2);

            AddMemoryInUse("msg2 load from ms2");

            ms2.Close();

            AddMemoryInUse("ms2.close");

            msg2.Dispose();

            AddMemoryInUse("msg2.dispose");
}

результат:
Memory in use 370 KB, after start
Memory in use 370 KB, after msg create
Memory in use 370 KB, after fs open
Memory in use 12191 KB, after fs copy to msg.stream
Memory in use 12199 KB, after fs.close
Memory in use 32214 KB, after ms2 = msg.GetMStream
Memory in use 32214 KB, after msg.dispose
Memory in use 32239 KB, after msg2 load from ms2
Memory in use 32239 KB, after ms2.close
Memory in use 32239 KB, after msg2.dispose

в чем дело ? как с этим бороться ? (кроме GC.Collect(2, GCCollectionMode.Forced))


--------------------
I want a perfect soul
PM MAIL ICQ   Вверх
Irdis
Дата 6.4.2010, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Дело в том, что GC не обещает собрать мусор в тот же момент, в который на объект пропала ссылка.

http://www.rsdn.ru/article/dotnet/GCnet.xml

Это сообщение отредактировал(а) Irdis - 6.4.2010, 17:38
PM MAIL   Вверх
uranpro
Дата 6.4.2010, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



я знаю =) да и ссылки не пропадали. меня интересует, почему метод .Close()/.Dispose() stream`a не освободил ресы ?


--------------------
I want a perfect soul
PM MAIL ICQ   Вверх
PashaPash
Дата 6.4.2010, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



uranpro, .Close()/.Dispose() не освобождает память. Память в .net освобождается только в момент сборки мусора. Если после GC.Collect(2, GCCollectionMode.Forced) память освобождается - то это как раз не утечка. 


--------------------
PM MAIL WWW   Вверх
uranpro
Дата 7.4.2010, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



понятно, но она занимает много времени... и освобождает все, а мне нужно только stream`ы

Добавлено через 2 минуты и 33 секунды
точнее не все, а мусор


--------------------
I want a perfect soul
PM MAIL ICQ   Вверх
PashaPash
Дата 7.4.2010, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



uranpro, а ты не вызывай сборку мусора. Вызывая сборку всех поколений, с Forced и ожиданием завершения ты практически выбрасываешь все наработки MS по сборке мусора за последние 10 лет smile
Зачем тебе нужно память из-под стримов освободить? Потому что GC.GetTotalMemory показывает пятизначное число, и оно тебе не нравится? Это не повод лезть в самонастраиваемый механизм GC smile

Методы класса GC вообще нельзя вызывать без полного понимания механизма работы сборщика. Забудь о них и спи спокойно.


--------------------
PM MAIL WWW   Вверх
uranpro
Дата 8.4.2010, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



с этой памятью... что-то я все напутал. ведь gc сам сделает все что нужно. 


--------------------
I want a perfect soul
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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