SpiderMonkey GC 通知和弱引用
SpiderMonkey GC notification and weak references
是否可以在 SpiderMonkey 收集(或即将收集)特定的 "GC thing" 时收到通知?
在 V8 中有 "weak handles" 附加了回调,当 V8 GC 决定处理的对象变得不可访问时,这些应该被调用。即使回调没有被调用(根据 V8 文档,这是可能的),我们仍然可以使用 v8::Persistent<T>::IsNearDeath()
检查句柄指向的对象是否即将被收集。
在SpiderMonkey中,我们有PersistentRooted,这是一个强引用。但是我们还没有找到任何方法以弱方式安全地引用一个对象,所以我们至少可以检查以下一种(或多种)情况:
- 对象变得不可访问;
- 对象已被收集;
- 对象即将被收集;
- 该对象只有一个引用(即我们的应用程序持有的引用)
But we have not found any way to safely reference an object in a weak manner, so we can check at least for one (or more) of the following conditions
[...]
- the object has been collected;
这可以通过 weak references
实现
如果你想探测它们,你可以简单地检查它们 return 是否为 null。
- the object is about to be collected;
至少从 C 代码来看,JSClass finalizer 应该允许您这样做。
是否可以在 SpiderMonkey 收集(或即将收集)特定的 "GC thing" 时收到通知?
在 V8 中有 "weak handles" 附加了回调,当 V8 GC 决定处理的对象变得不可访问时,这些应该被调用。即使回调没有被调用(根据 V8 文档,这是可能的),我们仍然可以使用 v8::Persistent<T>::IsNearDeath()
检查句柄指向的对象是否即将被收集。
在SpiderMonkey中,我们有PersistentRooted,这是一个强引用。但是我们还没有找到任何方法以弱方式安全地引用一个对象,所以我们至少可以检查以下一种(或多种)情况:
- 对象变得不可访问;
- 对象已被收集;
- 对象即将被收集;
- 该对象只有一个引用(即我们的应用程序持有的引用)
But we have not found any way to safely reference an object in a weak manner, so we can check at least for one (or more) of the following conditions
[...]
- the object has been collected;
这可以通过 weak references
实现如果你想探测它们,你可以简单地检查它们 return 是否为 null。
- the object is about to be collected;
至少从 C 代码来看,JSClass finalizer 应该允许您这样做。