Экспериментируете с автоматически удаляемыми элементами из WeakSet/WeakMap (посредством сборки мусора) в Node.js, когда .size не существует?

№1. Решение проблемы отсутствия свойства .size?

В JavaScript я никогда раньше не использовал ни WeakSet, ни WeakMap, и я не так много знаю о сборке мусора в целом (я разработчик PHP + JS, так что мне впервые действительно нужно подумать о вывозе мусора). Но я думаю, что у меня есть хороший вариант использования WeakMap прямо сейчас. Так что я хотел бы, по крайней мере, начать экспериментировать с ним.

Главное, что я хочу подтвердить в своих экспериментах, это автоматическое удаление объектов после их сборки мусора. Это было бы легко проверить, если бы я мог просто получить доступ к свойству WeakSet.size/WeakMap.size в экземплярах, чтобы проверить их размер, но они не существуют в «слабых» версиях.

Если возможно, я предполагаю, что результаты могут отличаться, поскольку размер будет зависеть от того, запущен ли уже сборщик мусора. Но это нормально, так как ни один из этих экспериментальных кодов не будет использоваться в продакшене... Я просто хочу подтвердить, что действительно понимаю, как работает сборка мусора и WeakSet/WeakMap. Идея использования этой функции без возможности протестировать (и, следовательно, полностью понять) ее очень беспокоит меня, и я обеспокоен тем, что в конечном итоге узнаю об утечках памяти, когда будет слишком поздно (в производстве).

Существуют ли какие-либо обходные пути или альтернативы для решения проблемы отсутствия WeakSet.size и WeakMap.size... хотя бы для отладки/тестирования/обучения?

Если это не обходной путь .size, есть ли способ проверить использование памяти моими экземплярами коллекции WeakMap? Это было бы столь же полезно, как и главная забота.

Единственное, о чем я сейчас могу думать, это проверка памяти всего процесса Node.js... что мне кажется не очень надежным.

#2. Для чего нужен .length?

Также я немного смущен тем, почему существует свойство .length в конструкторе класса/прототипе экземпляра как WeakSet, так и WeakMap (а не в ваших экземплярах).

В соответствии с:

... на обеих страницах написано, что .length это:

  • The value of the length property is 0.

Они буквально всегда жестко запрограммированы на число 0? Какой в ​​этом смысл?

Поиск «WeakSet.length» или «WeakMap.length» в Google (включая двойные кавычки для точных результатов) не дает никакой дополнительной информации, только около 20 результатов для каждого, которые являются просто зеркалами страниц MDN.


person LaVache    schedule 11.01.2020    source источник


Ответы (1)


Размер не будет доступен ни для WeakSet, ни для WeakMap, так как их ключи являются просто ссылками на объекты, и они обрабатываются сборщиком мусора. Поскольку сборщиком нельзя управлять вручную (или не следует), он освободит память этих объектов, как только на них больше не будет ссылок, в любой момент во время выполнения. Обходной путь, который вы предлагаете реализовать, чтобы увидеть его текущий размер, не будет эффективным и не рекомендуется с учетом этого.

length существует, так как и WeakSet, и WeakMap создаются с помощью своих прототипов. Учитывая, как сборщик позаботится об очистке ссылки на объект в любой момент,

Что касается эксперимента с ними, вы можете попробовать их в Chrome и открыть сборщик мусора (и вызвать его вручную), чтобы увидеть, как WeakMap очищается после потери ссылки на объект (объяснено в этот ответ). В противном случае вы все равно можете увидеть ссылку в WeakMap или WeakSet, так как devtools обычно предотвращает запуск сборщика мусора.

person Nihil    schedule 12.02.2020