JavaScript对象的终结器

时间:2013-11-28 12:46:32

标签: javascript memory-management finalizer asm.js

假设我有一些asm.js代码,可能是由emscripten创建的。假设它有一些相当大的堆分配结构,它由asm.js函数返回,作为一个指针,由一些JavaScript库拾取,包装在一个漂亮的JavaScript对象中。好到目前为止。

但是,如果该对象超出范围并被垃圾收集,会发生什么。现在,asm.js代码无法知道这一点,因此结构的内存将保持分配状态,从而导致内存泄漏。

有没有办法从JavaScript中为JavaScript对象添加终结器?

这样的终结器可用于释放asm.js中的内存,从而避免内存泄漏。到目前为止,我找不到记录在案的便携式方法来实现这一目标,但也许我一直在寻找错误的地方。

2 个答案:

答案 0 :(得分:3)

简单的答案是没有对此的支持。

由于asm.js代码需要管理自己的内存,因此与存储在asm端的对象交互的所有内容都需要尊重asm使用的内存管理器,而不是浏览器使用的内存管理器。您可以做的最好的事情是在创建或销毁对它的引用时,在引用内部asm内存的任何对象上显式调用方法。

答案 1 :(得分:0)

回到这个问题,我发现another answer指出a specification是弱引用和终结的some browsers implement。最终确定的主要组成部分是FinalizationRegistry

因此,根据您所定位的浏览器,这现在可能成为可能。如果需要使用显式发布调用来支持不具有此功能的浏览器,则可以在支持检测内存泄漏(即未在JavaScript代码中显式发布的对象)的地方使用终结器,并告知开发人员以便他们可以解决此问题。