JSValueRef 生命周期的研究

  1. 什么时候需要使用JSValueProtect保证JSValueRef不被释放?
    当把JSValueRef保存在堆内存中时,需要对JSValueRef使用JSValueProtect,否则此JSValueRef有可能被GC,导致crash
    巨坑示例:
JSValueRef* values = new JSValueRef[3];
for (int i = 0; i < 3; ++i) {
    // 这里由于是放堆上面,values[0]可能在i=1时,触发GC被释放
    values[i] = JSMakeNumber(ctx, 123);
}
JSValueRef arr = JSObjectMakeArray, ctx, 3, values, nulptr);
  1. 放在栈上的 JSValueRef 实例并立即使用的场景是否需要使用JSValueProtect?
    不需要,栈上的 JSValueRef 会在GC时加到root引用中,不会释放
    示例:
// 栈上内存不会被GC
JSValueRef value = JSValueMakeNumber(ctx, 1);
JSObjectCallAsFunction, ctx, func, nullptr, 1, &value, nullptr);
  1. JSCore 如何发现栈上的 JSValueRef ?
    JSCore 会通过栈顶和栈底的指针,对栈上内存进行扫描,如果其值在heap中有记录,那么GC时认为此对象可达,不会GC。

  2. GC 何时运行?
    理论上任何 JSCore 相关调用都可能触发 GC,比如 JSMakeValue、JSObjectCallAsFunction 等等

  3. GC 在哪个线程运行?
    GC 可以在调用 JSCore API 的线程或者独立的GC线程中运行

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值