有没有办法强制iOS(或Mac OS)JavaScriptCore VM垃圾收集器运行?我只需要测试内存泄漏,所以私有API就可以了。
答案 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上本地尝试了它,它似乎有效。