Info • • • • My name – Valera Kolupaev Email – [email protected] Wave for questions - http://bit.ly/bsu-dotnet-2010 All sources - https://code.google.com/p/bsu-epam-2010/ Today • .Net memory management • Destructors, Finalizers, Disposable • Generic constraints, Linq 2 Objects Зачем знать о GC • Понимать какую нагрузку на память создает ваш код • Понимать – почему ваша программа зависает • Знать – как диагностировать, почему ваша программа зависает • Представлять поведение программы под нагрузкой GC Facts • Если бы у .Net был настоящий механизм сборки мусора, большинство программ не дожило бы до первого запуска • .Net может только освободить память, удалив те экземпляры классов, на которые никто не ссылается • Когда работает механизм сборки мусора – ваша программа не работает • Выделение памяти в .Net очень быстрое How GC Works Алгоритм работы сборщика мусора: 1. Пометить все “GC Roots” 2. Пометить всех, на кого ссылается “GC Roots” 3. Goto 2 4. Запустить Dispose/Finalize для всех не помеченных. GC Root Not Garbage GC Roots • Static переменные • Переменные в стеке • Ссылки в регистрах CLR машины Finalization / Destructors • Finalizable facts • Сразу попадают в старшее поколение • Дольше “New” • Держат все объекты, на которые ссылаются Поколения GC • Проверять весь граф GC, каждый раз, очень дорого • Дешевле разделить GC на 3 «поколения» и собирать их по мере необходимости • Через «поколение» переходят объекты – пережившие сборку, в прошлый раз. • Каждое следующее поколение – собирается намного реже предыдущего. Состояние памяти После первой сборки, все кто выжил, попали в 1 поколение Программист, создал несколько новых объектов (в GC 0) Появились «мусорные» объекты Опять собрали GC 0 Новые объекты в GC 0 Новый мусор в GC 1 GC Demo Объекты со ссылками Объекты без ссылок не собранные GC Выводы о работе с GC • Если объект попал в 1 или 2 поколение, его еще долго не удалят • Большие объекты (> 85k) попадают сразу во 2 поколение (LOH) • Выделение памяти работает очень быстро • Выгоднее иметь много мало-живущих объектов • Finalizers/Destructors – создают нагрузку на GC • Finalizers != C++ Desctuctors IDisposable • Позволяет закрыть открытые ресурсы вместо С++ деструктора • Почти бесполезен, если программисты не используют using IDisposable Using() обязателен FileStream : IDisposable IDisposable and Finalizer • Если вы забыли вызвать Dispose(), это сделает Finalizer • Но объект попадет в следующее поколение • Если вы не забыли вызвать Dispose(), сообщите GC, что не надо вызывать Finalizer • GC.SupressFinalize(this); Virtual Dispose pattern • Problem: • Как сделать Dispose для Stream 2 или 3 ? Virtual Dispose pattern Virtual Dispose pattern LINQ 2 Objects • LINQ stands for Language Integrated Query • Значительно упрощает работу с коллекциями • Фильтрация, сортировка, группировка • Соединение (join) • Агрегация: Average, Max, Min, Running total • Имеет 2 синтаксиса • На основе Extension Methods & Anonymous Delegates (Lambdas) • “LINQ” Syntax LINQ 2 Objects :: LINQPad Yield Anonymous classes • Strongly typed • Immutable Join Delayed execution Things to tell • • • • There are exists LINQ 2 Objects and LINQ 2 SQL Delayed execution Method chaining (Fluent syntax) IEnumerable is RE-Enumerated each time you call it (Like YIELD) • Anonymous classes magic LINQ Pad Demo Task • Command line argument parser • Загружает конфигурацию явно или из атрибутов DTO • Тип параметра (string or boolean) • Проверяет введенное значение параметра • Название параметра и его описание • Возвращает «парсер» параметров который разбирает введённую строку и «заполняет» DTO Task