Мусор собирать неиспользуемые модули - PullRequest
0 голосов
/ 11 мая 2018

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

Причина, по-видимому, связана с тем, что называется ModuleMap. Вот снимок экрана из снимка памяти, который я сделал после того, как все сценарии перестали использоваться.

Chrome heap snapshot

Как вы можете видеть, объект Window предоставляет путь к этим модулям. Пока это так, я уверен, что в конечном итоге не хватит памяти, так как эти модули создаются каждый раз, когда пользователь редактирует свой сценарий.

Я хотел бы знать, есть ли способ заставить Chrome (и другие браузеры) выгружать эти модули, когда они больше не используются.

1 Ответ

0 голосов
/ 11 мая 2018

Я получаю ощущение от этой спецификации , что, возможно, ответ заключается в том, что вы не можете заставить модули выгружаться. Это потому, что любой данный модуль должен анализироваться только один раз для каждого работника Document. У меня нет возможности пообещать, что я никогда больше не буду использовать модуль с заданного URL-адреса после того, как выбросил его, поэтому у ModuleMap нет возможности собирать вещи.

И, действительно, читая исходный код Chromium, я не вижу вызовов UnregisterModuleScript . Вполне возможно, что это не весь соответствующий код, но если это так, то вполне понятно, что любой данный экземпляр ModuleMap будет зависеть от его модулей навсегда.

Похоже, теоретически я мог бы получить желаемое поведение от WebWorkers, поскольку они имеют различную глобальную область видимости. Если кто-нибудь скажет мне, правильно ли я лаю, это было бы полезно.

...