TGViewer
Настоящий JavaScript Настоящий JavaScript @true_js · 5.89K subscribers
Post #3655 323
⁣WeakMap и кастомные деструкторы: когда using ломает GC

Связка WeakMap и using с Symbol.dispose выглядит элегантно, но в production может обернуться утечками и гонками. Главная проблема — сборщик мусора не синхронизирован с вызовами деструкторов, что ломает интуитивное поведение.

Грабли 1: Живой ключ в WeakMap

Код вида cleanupMap.delete(this) внутри [Symbol.dispose] не гарантирует очистку. Объект жив на момент вызова деструктора, и запись в WeakMap может висеть, если ключ захвачен в замыкании или передан наружу. Лучше проверять через has() перед удалением — это не спасет от всех кейсов, но снизит риск.

Грабли 2: Порядок финализации в WeakSet

Если несколько ресурсов с общими зависимостями финализируются через using, порядок вызова Symbol.dispose не определен. Проверка pool.has() внутри деструктора может дать race condition — один ресурс уже удален, другой еще жив. В высоконагруженных системах это ведет к нестабильности.

Грабли 3: Циклы через Symbol-ключи

Использование символа с собственным [Symbol.dispose] как ключа в WeakMap, который чистится в деструкторе ресурса, вызывает циклический вызов и stack overflow. Пример: const cleanupSymbol = Symbol('cleanup'); cleanupSymbol[Symbol.dispose] = () => map.delete(cleanupSymbol);. Такой паттерн лучше вообще избегать.

Производственные советы:

* Вместо WeakMap в деструкторах используй обычные Map с ручной очисткой — это предсказуемее.
* Для WeakSet не полагайся на консистентность между деструкторами — используй отдельные флаги состояния.
* Тестируй на разных движках JS: V8 и SpiderMonkey финализируют по-разному, баги всплывают не сразу.

Вывод: WeakMap и WeakSet в паре с using — мощный, но опасный инструмент, требующий явного контроля жизненного цикла ссылок, иначе GC и деструкторы превращают чистый код в источник трудноуловимых багов.
More from @true_js
  1. Oct 2, 2026😅 Айтишник отправил в одну компанию три одинаковых резюме и только одно дошло до финала О…
  2. Oct 2, 2026Post #3961
  3. Oct 2, 2026🤣 Правильно расставленные приоритеты в моей жизни би лайк: 💥 xCode Journal
  4. Oct 1, 2026🤯 Люди взбунтовались против «пыточной для ИИ» На GitHub заметили открытый проект AI Tortu…
  5. Oct 1, 2026День в Заонежье начинается ещё в дороге. Мы встретим вас в аэропорту или на вокзале. Дальш…
  6. Oct 1, 2026Post #3946
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →