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

# 1. Обходной путь из-за отсутствия свойства .size?

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

Главное, что я хочу подтвердить в своих экспериментах, - это автоматическое удаление c объектов, когда они были собраны в мусор. Это было бы легко проверить, если бы я мог просто получить доступ к свойству 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 во все времена? Какой в ​​этом смысл?

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

1 Ответ

0 голосов
/ 12 февраля 2020

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

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

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

...