Перейти к содержимому

Memory leaks

В своей работе я пару раз сталкивалась с необходимостью фиксить утечки памяти, и каждый раз было оооочень сложно. Task manager браузера, memory во вкладке Performance, отдельная вкладка Memory — у нас есть очень крутые инструменты, но пользоваться ими не так-то просто. Буду разбираться: как понять, есть ли проблемы; как найти причину утечки и почему вообще утечки появляются.

Полезные и интересные ресурсы

Devtools

  • Раздел про Memory в Devtools — теория про память и утечки + описаны основные инструменты, предоставляемые хромом. Читать весь раздел 😉
  • Debugging memory leaks - HTTP 203 — видео, где Jake и Surma разбирают, как дебажить и фиксить утечки памяти на примере своего кода

Как работает Garbage Collector и что там в V8

  • Grokking V8 closures for fun (and profit?) by Vyacheslav Egorov (2012-14) — как V8 работает с замыканиями и что там по перфомансу. Низкоуровневые детали, классные схемы, главные мысли (как по мне):
    • V8 создаёт контекст при входе в функцию, а не в момент создания замыкания
    • Когда функции вложены друг в друга, контексты могут ссылаться друг на друга, создавая цепочки

Разбор кейсов

Утечки в React

  • Sneaky React Memory Leaks: How useCallback and closures can bite you by Kevin Schiener (2024) — в нашем коде на реакте много замыканий (даже если мы не помним про них) и в большинстве случаев всё будет хорошо. Пока мы не используем useCallback, чтобы функция не пересоздавалась при каждом ререндере — Кевин подробно разбирает, что происходит в таком случае и как избежать утечки.
  • Sneaky React Memory Leaks II: Closures Vs. React Query by Kevin Schiener (2024) — разбор, как можно создать утечку, используя react query. Рекомендация простая — выносить всю работу с useQuery и подобными штуками в кастомные хуки, и чем меньше хук — тем лучше.
  • Sneaky React Memory Leaks: How the React compiler won’t save you by Kevin Schiener (2024) — React Compiler решит за нас часть проблем (например, пример из первой статьи не будет актуален), но замыкания всё еще могут создать нам проблемы — Кевин рассказывает, какие, и предлагает использовать bind для того, чтобы избежать их.

Как найти утечку раньше, чем пользователи найдут её

// TODO

Как вычислить проблемный код и пофиксить

// TODO

Полезная теория

// TODO

Замыкания

// TODO

Garbage Collector

// TODO