Понимание вывода сборщика трассировки Emscripten - PullRequest
0 голосов
/ 01 февраля 2019

Я использую API-интерфейс трассировки в emscripten для проверки выделения памяти в моем коде.

В обзоре трассировщик"Сводка распределения"постоянно увеличивается, в ГБ, в то время как «Использование памяти» стабильно ниже 50 МБ.При просмотре отдельных кадров количество «Alloc» и «Free» одинаково (за исключением запуска), но количество выделенных и освобожденных байтов не равно.

Я неправильно читаю?Это проблема в настройке трасс?

1 Ответ

0 голосов
/ 01 февраля 2019

Все странные вещи случаются, потому что вы не можете реально отслеживать распределение памяти WebAssembly (или Emscripten), используя системные инструменты движка JS.Другими словами, куча управляется пользовательским кодом WebAssembly, а не механизмом JS, таким как V8.

Возможно, вы захотите проверить мое объяснение памяти WebAssembly .WebAssembly имеет одну линейную область памяти, которая называется WebAssembly.Memory.На самом деле это один большой JS ArrayBuffer WebAssembly.Memory.buffer , который является единственной областью памяти (кроме стека), которую модуль WebAssembly может касаться по своему дизайну.Хотя WebAssembly не может касаться какой-либо памяти за пределами этого единственного ArrayBuffer, он может делать что угодно с этим буфером.Поэтому большинство двоичных файлов WebAssemlby используют буфер в качестве области кучи.

WebAssembly 1.0 не определяет какие-либо виды встроенной пользовательской библиотеки, включая управление памятью.Это означает, что каждый код C / C ++, скомпилированный в WebAssembly, должен иметь собственную реализацию malloc(), тогда как хост-система - механизм JS в этом контексте - не имеет представления о том, что происходит внутри кучи.

Поэтому независимо от того, сколько вы выделили и освободили кучу в вашем коде Emscripten, в перспективе V8 использование памяти останется стабильным, поскольку оно уже выделило весь ArrayBuffer и передало экземпляру Emscripten.

Единственное исключениечто экземпляр WebAssembly может запросить движок JS увеличить размер ArrayBuffer , так как ему требуется больше кучи, точно так же, как sbrk в контексте C / C ++.Таким образом, распределение ядра JS имеет тенденцию к увеличению, пока не достигнет максимального размера WebAssembly.Memory(), который вы (или автоматически сгенерированный код JS, выполненный Emscripten) задаете.

...