在iOS上强制JavaScriptCore虚拟机的垃圾收集

时间:2016-02-28 23:13:01

标签: ios macos garbage-collection javascriptcore

有没有办法强制iOS(或Mac OS)JavaScriptCore VM垃圾收集器运行?我只需要测试内存泄漏,所以私有API就可以了。

1 个答案:

答案 0 :(得分:5)

使用JSBase.h中的以下函数:

/*!
@function JSGarbageCollect
@abstract Performs a JavaScript garbage collection.
@param ctx The execution context to use.
@discussion JavaScript values that are on the machine stack, in a register,
 protected by JSValueProtect, set as the global object of an execution context,
 or reachable from any such value will not be collected.

 During JavaScript execution, you are not required to call this function; the
 JavaScript engine will garbage collect as needed. JavaScript values created
 within a context group are automatically destroyed when the last reference
 to the context group is released.
*/
JS_EXPORT void JSGarbageCollect(JSContextRef ctx);

您可以使用JSContextRef只读属性从JSContext获取JSGlobalContextRef

<强>更新

我在WebKit中找到了下一个更改 - bugs.webkit.org/show_bug.cgi?id=84476

  

JSGarbageCollect不应同步调用collectAllGarbage()。   相反,它应该通知GCActivityCallback它已经放弃了   一个对象图,它将把计时器设置为在某个点运行   JSC可以根据自己的政策决定未来。

这解释了为什么以前的解决方案不能按预期工作。

深入研究WebKit源代码,我找到了另一种有趣的方法。请尝试以下代码:

JS_EXPORT void JSSynchronousGarbageCollectForDebugging(JSContextRef ctx);

@interface JSContext (GarbageCollection)

-(void)garbageCollect {
    JSSynchronousGarbageCollectForDebugging(self.JSGlobalContextRef);
}

@end

之后,只需在garbageCollect实例上调用JSContext方法即可。我已经在iOS上本地尝试了它,它似乎有效。