JavaScript对象的终结器

JavaScript对象的终结器,javascript,memory-management,finalizer,asm.js,Javascript,Memory Management,Finalizer,Asm.js,假设我有一些asm.js代码,可能是由emscripten创建的。假设它有某种相当大的堆分配结构,由asm.js函数作为指针返回,该指针由某个JavaScript库拾取并封装在一个漂亮的JavaScript对象中。到目前为止还不错 但是,如果该对象超出范围并被垃圾回收,会发生什么呢。现在,asm.js代码无法知道这一点,因此结构的内存将保持分配状态,从而导致内存泄漏 是否有办法从JavaScript中向JavaScript对象添加终结器? 这样的终结器可用于取消分配asm.js中的内存,从而避免

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

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

是否有办法从JavaScript中向JavaScript对象添加终结器?


这样的终结器可用于取消分配asm.js中的内存,从而避免内存泄漏。到目前为止,我还没有找到一种记录在案的便携式方法来实现这一点,但也许我找错了地方。

简单的答案是,没有对这一点的支持


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

回到这个问题,我发现,弱引用和终结是有限制的。最后定稿的核心部分是


因此,根据您的目标浏览器,这现在可能是可能的。如果您需要使用显式释放调用来支持没有此功能的浏览器,则可以在受支持的位置使用终结器来检测内存泄漏(即未在JavaScript代码中显式释放的对象)并让开发人员知道,这样他们就可以解决这个问题。

@user3075942:不是真的:这个问题关心的是时间,而我不关心时间,只要我能得到事件通知。Java有垃圾收集和终结器,我希望javaScript中也有类似的东西。实际上,这个问题的标题有点误导性,实际上它的作者要求在JS中使用析构函数/终结器。另见