Слайд 1
Application Memory Model
“Journey through the dark”
Докладчик: Егор Волков
Дата: 4 июля
2016 года
Слайд 2Application Memory Model
640 килобайт хватит всем
Память, что и куда
Участки памяти
вашего приложения
Pagination и swapping
Application memory footprint
Application life cycle с точки
зрения памяти
Heap vs. Stack
Garbage Collection, “stop the world”
Embedded systems с точки зрения памяти
Как сделать приложение медленным?
Многопоточность и память
Слайд 3Application Memory Model
Каждому приложению нужна память!
ОС владеет всем объёмом памяти,
распределение и выделение памяти на ней же
Приложение может при старте
запросить кусок памяти и, скорее всего, оно его получит
Память - ресурс разделяемый и ограниченный
Производительность приложения не зависит от того, сколько памяти оно использует, а от того, КАК оно её использует
Хитрые системщики придумали разные штуки, чтобы управлять памятью более эффективно. Как мы, прикладные программисты, можем свести их усилия на нет?
Ручное управление памятью - вот тебе нога, а вот дробовик
Слайд 4Application Memory Model
Память вашего приложения можно разделить на 4 части:
CODE
— сегмент кода. Содержит исполняемый код.
DATA — сегмент статических данных.
Содержит константы и прочие статические данные (вычисляемые при компиляции/сборке).
STACK — сегмент стека. Содержит данные для используемых функций (локальные переменные).
HEAP — сегмент динамических данных ("куча”). Содержит динамические данные для всей программы.
Слайд 6Application Memory Model
Memory pagination - механизм разделения и управления памятью.
Физическая
память делится на сегменты (страницы) фиксированного размера
При изменении страницы в
памяти приложением, она помечается как “грязная” и должна быть записана на диск перед выгрузкой
Если не записать содержимое - оно исчезнет, а ОС будет очень расстроена (BSOD, kernel panic, взрыв на производстве)
Виртуальная память использует этот механизм чтобы обманывать программистов
Процесс чтения/записи и загрузки/выгрузки страниц называется свопинг (swapping)
Такое веселье делает возможным memory thrashing (пробуксовка)
Слайд 8Application Memory Model
Application Memory Footprint
Ваше приложение занимает память. Но почему
так много?
Подозрение на memory leak
Подозрение на кривую либу
Подозрение на кривые
руки
Подозрение на несправедливость вселенной
Не аллоцируй в цикле и будешь счастлив
Слайд 9Application Memory Model
Application lifecycle
Память приложения изолирована от всей остальной памяти
средствами ОС.
Приложение старутет, ОС грузит всё, что ему нужно для
работы (код, данные, библиотеки)
Приложение получает управление, грузит всё, что считает нужным (обычно всякий мусор)
Приложение выделяет память и освобождает память по-ходу своего выполнения
Приложение запрашивает ещё памяти, ОС предоставляет (или нет) ещё памяти
По завершению выполнения память у приложения отбирают и ОС её утилизирует
Слайд 10Application Memory Model
Heap memory versus stack memory
Слайд 11Application Memory Model
Garbage collection, “stop the world” problem
Динамическая память подвержена
фрагментации и “загрязнению”. Выход - garbage collection.
Garbage Collection - неэффективный
костыль и большущий оверхед, но мы любим его. За что?
Управление памятью - бесконечная гонка оптимизаций и глупых программистов
“Зачем мне ваще париться? Оно же само почистит!” и другие цитаты великих людей
Stop the world - решение проблем в лоб
Разные GC для разных целей (на примере Java)
Слайд 12Application Memory Model
Embedded systems с точки зрения памяти
Другие модели памяти
для других целей
Оптимизируем, как в старые-добрые времена! (сделать ностальгическое лицо)
Регистры!
Много их! А ещё, отдельная RAM и ROM!
EEPROM - энергонезависимо, медленно, но зато надолго*
Война с компилятором за каждый байт памяти, иногда - буквально.
Дисциплина специальной олимпиады - JavaScript on Board и Java SE Embedded (немного лучше)
Хардкорные и бородатые программеры пишут на ASM и руками ворочают байты и биты - “ганебна зрада”
Слайд 13Application Memory Model
Как сделать приложение медленным?
Всегда бездумно аллоцируй большие обьекты
в цикле
Слайд 14Application Memory Model
Как сделать приложение медленным?
Думать, что стек огромен и
создавать на нём большие штуки
Не чистить память, надеясь на ОС
Создавать/утилизировать
очень много объектов, которые дороги/долги в создании/утилизации
Игнорировать то, что возвращает функция
Писать многопоточный код с большим количеством локов и чтением/запись в память
Писать на Java/C#/Ruby/Python/JS (особенно JS!)/%languagename%
Слайд 15Application Memory Model
Многопоточность и память
Многопоточное программирование - суровое настоящее
Компилятор кода
на Android даже не даст вам делать клёвые штуки из
UI потока - “атата!”. Шожиделать?
Mutex, event, conditional variable - synchronization primitives
Функциональное программирование и иммутабельность немного спасает положение
Теперь нужно думать не только о памяти, но и
об обращениях к ней
Один неверный шаг и всё взорвётся - sad, but true
Слайд 16Application Memory Model
Каждому приложению нужна память!
Не получится бездумно везде тыкать
аллокации и верить в то, что вам повезёт
Компиляторы и garbage
collector’ы становятся лучше с каждым днём, а программисты - хуже
Защита от дурака в современных IDE
Помним о сущности памяти как ресурсе - она одна, приложений много
Многопоточность - на порядок больше проблем и возможностей
Извечный “CPU-2-memory” tradeoff и реальность
Слайд 17Application Memory Model
Сейчас самое время задать свой вопрос!
Слайд 18
Application Memory Model
Спасибо за внимание!
Докладчик: Егор Волков
Дата: 7 июля 2016
года