Содержание
- 2. Основные этапы работы с памятью Выделение памяти под ресурс Инициализация памяти Использование памяти Очистка памяти/освобождение ресурса
- 3. Проблемы управления памятью Память не бесконечна! Явное управление памятью отвлекает программиста от его основных задач Ошибки
- 4. Проблемы управления памятью (окончание) Необходимо различать уничтожение памяти (уничтожение объекта/уничтожение путей доступа) и утилизацию памяти (сборка
- 5. Влияние управления памятью на языки программирования Разработка практически всех языков программирования ориентирована на ту или иную
- 6. Примеры различных подходов Алгол 60: "первый идентификатор", с которым ассоциируется структура данных; "первый идентификатор" разрушается при
- 7. Неявное управление памятью Тенденция развития современных языков программирования: предоставить программисту только неявные средства управления памятью, через
- 8. Фазы управления памятью Начальное распределение памяти методы учета свободной памяти Утилизация памяти перемещение указателя стека сборка
- 9. Статическое управление памятью Простейший способ распределения памяти Производится во время трансляции и не меняется во время
- 10. Стековое управление памятью Простейший метод распределения памяти времени выполнения Освобождение памяти в обратном порядке Задачи утилизации,
- 11. Управление кучей Куча - это блок памяти, части которого выделяются и освобождаются способом, не подчиняющимся какой-либо
- 12. Начальное распределение и повторное использование Обычное решение - список свободного пространства. Например, в C-runtime heap для
- 13. Различные подходы к утилизации памяти Явный захват/возврат памяти Механизм malloc/free. Проблема мусора и висячих ссылок Счетчики
- 14. Сборка мусора Основная идея: допускается мусор, чтобы избежать висячих ссылок При исчерпании памяти мы выявляем мусор
- 15. Алгоритм выделения памяти в .NET Все ресурсы выделяются из управляемой кучи Стековый механизм выделения памяти (хранится
- 16. Алгоритм сборки мусора (нулевое приближение) Активные элементы определяются просмотром от корневых объектов (глобальные, статические, локальные объекты
- 17. Как все это работает? class Application { public static int Main(String[] args) { // ArrayList object
- 18. Проблемы сборки мусора Т.к. ссылки изменяются, на время работы сборщика мусора вся полезная работа прекращается -
- 19. Завершители Позволяют выполнить необходимые операции перед тем, как объект будет освобожден сборщиком мусора Завершители не являются
- 20. Проблемы завершителей Объекты с завершителями дольше создаются, требуют дополнительных затрат ресурсов и дольше остаются в системе
- 21. Finalization Internals? Память до сборки мусора Память после первой сборки мусора Память после второй сборки мусора
- 22. Воскрешение объектов class Application { static public Object ObjHolder; // defaults to null ... } public
- 23. Поведение воскрешенных объектов Объект уже был завершен; поведение малопредсказуемо Воскрешаются также все объекты, на которые указывал
- 24. Форсированная очистка объектов Методы Close/Dispose (Close для объектов, которые могут быть переиспользованы, Dispose для "одноразовых" объектов)
- 25. Метод SuppressFinalize public class FileStream : Stream { public override void Close() { // Clean up
- 26. Завершители нельзя уравновешивать! Повторные вызовы ReRegisterForFinalize нельзя уравновесить многократными SuppressFinalize, т.к. после вызова Finalize соответствующий флаг
- 27. Связанная проблема FileStream fs = new FileStream("C:\\SomeFile.txt", FileMode.Open, FileAccess.Write, FileShare.Read) StreamWriter sw = new StreamWriter (fs);
- 28. Слабые ссылки Ссылка на объект из корневого объекта называется сильной ссылкой (strong reference) Существует механизм слабых
- 29. Пример использования слабых ссылок Void Method() { Object o = new Object(); // Creates a strong
- 30. Зачем нужны слабые ссылки? Для оптимизации: некоторые объекты легко создаются, но требуют много памяти (образ структуры
- 31. Два типа слабых ссылок Конструктор слабых ссылок имеет параметр trackRessurection (по умолчанию false) Слабые ссылки, не
- 32. Алгоритм сборки мусора (первое приближение) GC строит граф достижимых объектов (см. выше) GC просматривает таблицу коротких
- 33. Поколения Исследования показали, что для большинства программ верны следующие предположения: Чем моложе объект, тем меньше его
- 34. Пример поколений объектов
- 35. Оптимизация алгоритма сборки мусора Сборка мусора только в нулевом поколении Остановка обхода графа на старых объектах
- 36. Сборка мусора в многопоточных приложениях Все потоки должны приостанавливаться на время сборки мусора Fully Interruptible Code
- 37. Сборка крупных объектов Крупные объекты (больше 20 Кб) выделяются в отдельной куче. Завершение и освобождение крупных
- 38. Явное использование сборки мусора System.GC.Collect() инициирует немедленную сборку мусора (параметр - номер поколения, по умолчанию =
- 40. Скачать презентацию