Уничтожить экземпляр WebAssembly?

Есть ли способ уничтожить работающий экземпляр Web Assembly после его создания?

например созданный с помощью любого из них:

WebAssembly.instantiateStreaming()
WebAssembly.instantiate()
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
742
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Объекты экземпляра Wasm автоматически удаляются сборщиком мусора, как и все остальное в куче JS. Все, что принадлежит модулю, который больше не используется, также собирается.

Почему вы хотите уничтожить их явно?

Редактировать: Судя по вашим комментариям, ваш реальный вопрос заключается в том, как прервать выполнение кода Wasm, потому что он может иметь бесконечный цикл. Ответ таков: это невозможно. Веб-платформа не имеет механизма для программного прерывания или завершения выполнения. Создание бесконечных циклов — ошибка дизайна в веб-приложении.

Я создаю игровую площадку/«скрипку» для 3D-движок, написанный на Go — вы можете написать код Go в браузере, скомпилировать его в веб-сборку и запустить. Все работает, за исключением того, что каждый раз, когда выполняется фрагмент и создается новый экземпляр WebAsssembly, используемая память увеличивается, поскольку предыдущие экземпляры все еще работают. Запуск фрагмента несколько раз приводит к сбою страницы из-за ограничения памяти WASM (4 ГБ). Я не могу полагаться на автора фрагмента, чтобы убедиться, что его программа завершится, и в большинстве случаев программы не завершатся, потому что у них есть цикл рендеринга.

Daniel Salvadori 20.03.2019 17:51

Я не понимаю, почему экземпляры все еще «работают». Если ваш код JS удаляет все ссылки на эти экземпляры и их экспорт, их следует восстановить. Возможно, ваш JS-код случайно поддерживает некоторые из них доступными и живыми дольше, чем вы предполагали, тем самым создавая утечку пространства, которую вы наблюдаете?

Andreas Rossberg 20.03.2019 21:38

Экземпляры продолжают работать, потому что внутри кода WASM существует бесконечный цикл, то есть цикл рендеринга. Насколько я могу судить, никаких внешних ссылок на WASM не сохраняется.

Daniel Salvadori 21.03.2019 00:21

Что ж, бесконечные циклы в браузерном приложении — это ошибка дизайна. Веб-платформа не имеет механизма прерывания работающего кода ни в Wasm, ни в JS. Если вы хотите, чтобы пользовательский код не запускался в бесконечные циклы, вам, вероятно, придется ввести какое-то условие завершения.

Andreas Rossberg 21.03.2019 07:54
Веб-платформа не имеет механизма для программного прерывания или завершения выполнения. Это каким-то образом неявно исключает WebWorkers? Потому что там определенно можно убить бесконечный цикл извне (Рабочий.завершить()), и хотя я вообще не эксперт по WA, мне интересно, что происходит с экземпляром WA, запущенным из Worker, который завершается таким образом...
Kaiido 21.03.2019 09:00

@Kaiido, верно, я думаю, что завершение убивает весь рабочий процесс, так что это должно освободить все ресурсы, удерживаемые им. Но я не уверен, что ОП использует рабочих, поскольку они упоминают, что это цикл рендеринга. OTOH, я не понимаю, как какой-либо Wasm может работать в фоновом режиме, не будучи рабочим. Возможно, требуется дополнительная информация. Я подозреваю, что реальная проблема может быть связана со средой выполнения Go и ее реализацией облегченной многопоточности.

Andreas Rossberg 21.03.2019 10:31

После некоторой обрезки я выяснил, какой именно код Go вызывает зависание памяти. Это когда я регистрирую обратный вызов requestAnimationFrame. Если я вызову os.Exit(1) до этого, вся память WASM будет освобождена, но если я позвоню позже, он зависнет. Движок JS должен хранить внутреннюю ссылку на функцию WASM, которую я не могу удалить, не зная requestID, выданного при ее регистрации.

Daniel Salvadori 21.03.2019 14:56

Я не знаю, как Go реализует os.Exit в браузере или как вы регистрируете обратный вызов из Go, но у меня есть сильное подозрение, что виновником является среда выполнения Go.

Andreas Rossberg 22.03.2019 07:56

Что, если вы хотите. восстанавливать экземпляр Wasm каждый раз, когда вы меняете размер экрана? Действительно ли сборка мусора сработает в нужное время?

Got To Figure 15.12.2020 22:22

@Админы, определите "в нужное время". Современные сборщики мусора являются инкрементными, они не запускаются в определенные моменты времени, а как бы постоянно работают в фоновом режиме, выполняя небольшие фрагменты работы. В браузерах они также обнаруживают время простоя, когда они могут выполнять больше работы, потому что больше ничего не происходит.

Andreas Rossberg 16.12.2020 08:28

Я имею в виду, что это мусор, собирающий всю среду, и это не похоже на то, что существует API-интерфейс уничтожения с обещанием, когда оно будет сделано.

Got To Figure 17.12.2020 15:14

Другие вопросы по теме