Info

advertisement
Info
•
•
•
•
My name – Valera Kolupaev
Email – Valera.Kolupaev@gmail.com
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
Download