JSValueRef 生命周期的研究

本文探讨了在JSCore中使用JSValueRef时,如何避免因垃圾回收(GC)而导致的程序崩溃。详细介绍了在堆内存中保存JSValueRef时使用JSValueProtect的重要性,并解释了GC的工作原理及其触发条件。
  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线程中运行

在faultlog中有crash堆栈 Generated by HiviewDFX@OpenHarmony ================================================================ Device info:HUAWEI Pura 70 Pro Build info:HBN-AL00 5.0.0.102(SP6C00E102R5P9) Fingerprint:fe852e60f9fa4b7b0423390aa81409b40fa5a5445760207f94792afd3ea3975a Module name:com.ohos.sceneboard Version:1.0.0.71 VersionCode:10000071 PreInstalled:Yes Foreground:No Timestamp:2024-11-05 11:45:24.864 Pid:38624 Uid:20020021 Process name:com.ohos.sceneboard:sysDialog/common Process life time:2s Reason:Signal:SIGSEGV(SEGV_MAPERR)@0x0072756f73657237  Fault thread info: Tid:38624, Name:ysDialog/common #00 pc 000000000037a60c /system/lib64/platformsdk/libark_jsruntime.so(panda::ecmascript::EcmaStringTable::GetOrInternString(panda::ecmascript::EcmaVM*, unsigned char const*, unsigned int, bool)+256)(86e6ad7dc5574cd295e8d7673575eb42) #01 pc 00000000005be89c /system/lib64/platformsdk/libark_jsruntime.so(panda::ecmascript::ObjectFactory::NewFromUtf8(std::__h::basic_string_view<char, std::__h::char_traits<char>>)+72)(86e6ad7dc5574cd295e8d7673575eb42) #02 pc 000000000058a3cc /system/lib64/platformsdk/libark_jsruntime.so(panda::StringRef::NewFromUtf8(panda::ecmascript::EcmaVM const*, char const*, int)+152)(86e6ad7dc5574cd295e8d7673575eb42) #03 pc 000000000003d384 /system/lib64/platformsdk/libace_napi.z.so(NapiDefineProperty(napi_env__*, panda::Local<panda::ObjectRef>&, NapiPropertyDescriptor)+84)(0b5454f3aaf223a9bf21c13aa9a9a438) #04 pc 00000000000585cc /system/lib64/platformsdk/libace_napi.z.so(napi_define_properties+236)(0b5454f3aaf223a9bf21c13aa9a9a438) #05 pc 00000000000090a0 /system/lib64/module/multimodalinput/libinputconsumer.z.so(OHOS::MMI::MmiInit(napi_env__*, napi_value__*) (.cfi)+176)(f3cc9853b92735efa5fe823a64a055b9) #06 pc 00000000000466f4 /system/lib64/platformsdk/libace_napi.z.so(ArkNativeEngine::ArkNativeEngine(panda::ecmascript::EcmaVM*, void*, bool)::$_3::__invoke(panda::JsiRuntimeCallInfo*)+996)(0b5454f3aaf223a9bf21c13aa9a9a438) #07 pc 000000000057a624 /system/lib64/platformsdk/libark_jsruntime.so(panda::Callback::RegisterCallback(panda::ecmascript::EcmaRuntimeCallInfo*)+272)(86e6ad7dc5574cd295e8d7673575eb42) #08 pc 00000000003f2748 /system/lib64/module/arkcompiler/stub.an(RTStub_AsmInterpreterEntry+208) #09 pc 00000000003a1388 /system/lib64/platformsdk/libark_jsruntime.so(panda::ecmascript::InterpreterAssembly::Execute(panda::ecmascript::EcmaRuntimeCallInfo*)+216)(86e6ad7dc5574cd295e8d7673575eb42) #10 pc 000000000059dd10 /system/lib64/platformsdk/libark_jsruntime.so(panda::FunctionRef::Call(panda::ecmascript::EcmaVM const*, panda::Local<panda::JSValueRef>, panda::Local<panda::JSValueRef> const*, int)+388)(86e6ad7dc5574cd295e8d7673575eb42) #11 pc 0000000000551d28 /system/lib64/platformsdk/libark_jsruntime.so(panda::ecmascript::SourceTextModule::LoadNativeModuleImpl(panda::ecmascript::EcmaVM*, panda::ecmascript::JSThread*, panda::ecmascript::JSHandle<panda::ecmascript::SourceTextModule> const&, panda::ecmascript::ModuleTypes)+936)(86e6ad7dc5574cd295e8d7673575eb42) #12 pc 000000000054ee3c /system/lib64/platformsdk/libark_jsruntime.so(panda::ecmascript::SourceTextModule::LoadNativeModule(panda::ecmascript::JSThread*, panda::ecmascript::JSHandle<panda::ecmascript::SourceTextModule> const&, panda::ecmascript::ModuleTypes)+96)(86e6ad7dc5574cd295e8d7673575eb42) #13 pc 00000000005526dc /system/lib64/platformsdk/libark_jsruntime.so(panda::ecmascript::SourceTextModule::EvaluateNativeModule(panda::ecmascript::JSThread*, panda::ecmascript::JSHandle<panda::ecmascript::SourceTextModule>, panda::ecmascript::ModuleTypes)+116)(86e6ad7dc5574cd295e8d7673575eb42) #14 pc 0000000000555f64 /system/lib64/platformsdk/libark_jsruntime.so(86e6ad7dc5574cd295e8d7673575eb42) #15 pc 0000000000555690 /system/lib64/platformsdk/libark_jsruntime.so(86e6ad7dc5574cd295e8d7673575eb42) #16 pc 0000000000555eb4 /system/lib64/platformsdk/libark_jsruntime.so(86e6ad7dc5574cd295e8d7673575eb42) #17 pc 0000000000555690 /system/lib64/platformsdk/libark_jsruntime.so(86e6ad7dc5574cd295e8d7673575eb42) #18 pc 0000000000555eb4 /system/lib64/platformsdk/libark_jsruntime.so(86e6ad7dc5574cd295e8d7673575eb42) #19 pc 0000000000555690 /system/lib64/platformsdk/libark_jsruntime.so(86e6ad7dc5574cd295e8d7673575eb42) #20 pc 0000000000555eb4 /system/lib64/platformsdk/libark_jsruntime.so(86e6ad7dc5574cd295e8d7673575eb42) #21 pc 0000000000555690 /system/lib64/platformsdk/libark_jsruntime.so(86e6ad7dc5574cd295e8d7673575eb42) #22 pc 0000000000555eb4 /system/lib64/platformsdk/libark_jsruntime.so(86e6ad7dc5574cd295e8d7673575eb42) #23 pc 0000000000555690 /system/lib64/platformsdk/libark_jsruntime.so(86e6ad7dc5574cd295e8d7673575eb42) #24 pc 0000000000555eb4 /system/lib64/platformsdk/libark_jsruntime.so(86e6ad7dc5574cd295e8d7673575eb42) #25 pc 0000000000555690 /system/lib64/platformsdk/libark_jsruntime.so(86e6ad7dc5574cd295e8d7673575eb42) #26 pc 0000000000555eb4 /system/lib64/platformsdk/libark_jsruntime.so(86e6ad7dc5574cd295e8d7673575eb42) #27 pc 0000000000555690 /system/lib64/platformsdk/libark_jsruntime.so(86e6ad7dc5574cd295e8d7673575eb42) #28 pc 0000000000555eb4 /system/lib64/platformsdk/libark_jsruntime.so(86e6ad7dc5574cd295e8d7673575eb42) #29 pc 0000000000555690 /system/lib64/platformsdk/libark_jsruntime.so(86e6ad7dc5574cd295e8d7673575eb42) #30 pc 0000000000555eb4 /system/lib64/platformsdk/libark_jsruntime.so(86e6ad7dc5574cd295e8d7673575eb42) #31 pc 0000000000555690 /system/lib64/platformsdk/libark_jsruntime.so(86e6ad7dc5574cd295e8d7673575eb42) #32 pc 0000000000555eb4 /system/lib64/platformsdk/libark_jsruntime.so(86e6ad7dc5574cd295e8d7673575eb42) #33 pc 0000000000555690 /system/lib64/platformsdk/libark_jsruntime.so(86e6ad7dc5574cd295e8d7673575eb42) #34 pc 0000000000555eb4 /system/lib64/platformsdk/libark_jsruntime.so(86e6ad7dc5574cd295e8d7673575eb42) #35 pc 0000000000555690 /system/lib64/platformsdk/libark_jsruntime.so(86e6ad7dc5574cd295e8d7673575eb42) #36 pc 0000000000555480 /system/lib64/platformsdk/libark_jsruntime.so(panda::ecmascript::SourceTextModule::Evaluate(panda::ecmascript::JSThread*, panda::ecmascript::JSHandle<panda::ecmascript::SourceTextModule> const&, void const*, unsigned long, bool)+388)(86e6ad7dc5574cd295e8d7673575eb42) #37 pc 0000000000430ad0 /system/lib64/platformsdk/libark_jsruntime.so(86e6ad7dc5574cd295e8d7673575eb42) #38 pc 0000000000430de4 /system/lib64/platformsdk/libark_jsruntime.so(panda::ecmascript::JSPandaFileExecutor::ExecuteModuleBufferSecure(panda::ecmascript::JSThread*, unsigned char*, unsigned long, std::__h::basic_string<char, std::__h::char_traits<char>, panda::ecmascript::CAddressAllocator<char>> const&, bool)+636)(86e6ad7dc5574cd295e8d7673575eb42) #39 pc 00000000005aa7c4 /system/lib64/platformsdk/libark_jsruntime.so(panda::JSNApi::ExecuteModuleBufferSecure(panda::ecmascript::EcmaVM*, unsigned char*, int, std::__h::basic_string<char, std::__h::char_traits<char>, std::__h::allocator<char>> const&, bool)+304)(86e6ad7dc5574cd295e8d7673575eb42) #40 pc 0000000000045608 /system/lib64/platformsdk/libace_napi.z.so(ArkNativeEngine::RunScriptBuffer(std::__h::basic_string<char, std::__h::char_traits<char>, std::__h::allocator<char>> const&, unsigned char*, unsigned long, bool)+344)(0b5454f3aaf223a9bf21c13aa9a9a438) #41 pc 000000000004f944 /system/lib64/platformsdk/libruntime.z.so(7e47abbae2c4d7431134c7f7df1a1d0d) #42 pc 000000000004e8d8 /system/lib64/platformsdk/libruntime.z.so(OHOS::AbilityRuntime::JsRuntime::RunScript(std::__h::basic_string<char, std::__h::char_traits<char>, std::__h::allocator<char>> const&, std::__h::basic_string<char, std::__h::char_traits<char>, std::__h::allocator<char>> const&, bool)+2124)(7e47abbae2c4d7431134c7f7df1a1d0d) #43 pc 000000000004eb6c /system/lib64/platformsdk/libruntime.z.so(OHOS::AbilityRuntime::JsRuntime::LoadJsModule(std::__h::basic_string<char, std::__h::char_traits<char>, std::__h::allocator<char>> const&, std::__h::basic_string<char, std::__h::char_traits<char>, std::__h::allocator<char>> const&)+160)(7e47abbae2c4d7431134c7f7df1a1d0d) #44 pc 000000000004f39c /system/lib64/platformsdk/libruntime.z.so(7e47abbae2c4d7431134c7f7df1a1d0d) #45 pc 000000000005539c /system/lib64/platformsdk/libappkit_native.z.so(OHOS::AbilityRuntime::JsAbilityStage::Create(std::__h::unique_ptr<OHOS::AbilityRuntime::Runtime, std::__h::default_delete<OHOS::AbilityRuntime::Runtime>> const&, OHOS::AppExecFwk::HapModuleInfo const&)+712)(434be6c4cc29aa0e83a834a3ee7c576a) #46 pc 0000000000053af8 /system/lib64/platformsdk/libappkit_native.z.so(OHOS::AbilityRuntime::AbilityStage::Create(std::__h::unique_ptr<OHOS::AbilityRuntime::Runtime, std::__h::default_delete<OHOS::AbilityRuntime::Runtime>> const&, OHOS::AppExecFwk::HapModuleInfo const&)+204)(434be6c4cc29aa0e83a834a3ee7c576a) #47 pc 00000000000df098 /system/lib64/platformsdk/libappkit_native.z.so(OHOS::AppExecFwk::OHOSApplication::AddAbilityStage(std::__h::shared_ptr<OHOS::AppExecFwk::AbilityLocalRecord> const&, std::__h::function<void (std::__h::shared_ptr<OHOS::AbilityRuntime::Context> const&)> const&, bool&)+600)(434be6c4cc29aa0e83a834a3ee7c576a) #48 pc 00000000000a8f20 /system/lib64/platformsdk/libappkit_native.z.so(OHOS::AppExecFwk::MainThread::HandleLaunchAbility(std::__h::shared_ptr<OHOS::AppExecFwk::AbilityLocalRecord> const&)+2028)(434be6c4cc29aa0e83a834a3ee7c576a) #49 pc 00000000000bba20 /system/lib64/platformsdk/libappkit_native.z.so(434be6c4cc29aa0e83a834a3ee7c576a) #50 pc 000000000001bdb4 /system/lib64/chipset-pub-sdk/libeventhandler.z.so(OHOS::AppExecFwk::EventHandler::DistributeEvent(std::__h::unique_ptr<OHOS::AppExecFwk::InnerEvent, void (*)(OHOS::AppExecFwk::InnerEvent*)> const&)+1140)(40c16b704ac4bcd1efc8b2c5d49bc94d) #51 pc 000000000002d6a8 /system/lib64/chipset-pub-sdk/libeventhandler.z.so(OHOS::AppExecFwk::(anonymous namespace)::EventRunnerImpl::ExecuteEventHandler(std::__h::unique_ptr<OHOS::AppExecFwk::InnerEvent, void (*)(OHOS::AppExecFwk::InnerEvent*)>&)+348)(40c16b704ac4bcd1efc8b2c5d49bc94d) #52 pc 000000000002cf64 /system/lib64/chipset-pub-sdk/libeventhandler.z.so(OHOS::AppExecFwk::(anonymous namespace)::EventRunnerImpl::Run()+908)(40c16b704ac4bcd1efc8b2c5d49bc94d) #53 pc 0000000000030308 /system/lib64/chipset-pub-sdk/libeventhandler.z.so(OHOS::AppExecFwk::EventRunner::Run()+528)(40c16b704ac4bcd1efc8b2c5d49bc94d) #54 pc 00000000000ad8a8 /system/lib64/platformsdk/libappkit_native.z.so(OHOS::AppExecFwk::MainThread::Start()+604)(434be6c4cc29aa0e83a834a3ee7c576a) #55 pc 0000000000004e28 /system/lib64/appspawn/appspawn/libappspawn_ace.z.so(RunChildProcessor(AppSpawnContent*, AppSpawnClient*)+568)(7e7fe3f0ffff10f55db1df1752823559) #56 pc 000000000000b568 /system/bin/appspawn(AppSpawnChild+576)(604a04c1e54a21974375103a93f821a8) #57 pc 000000000000b1fc /system/bin/appspawn(AppSpawnProcessMsg+712)(604a04c1e54a21974375103a93f821a8) #58 pc 0000000000013c44 /system/bin/appspawn(ProcessSpawnReqMsg+224)(604a04c1e54a21974375103a93f821a8) #59 pc 00000000000129c4 /system/bin/appspawn(OnReceiveRequest+132)(604a04c1e54a21974375103a93f821a8) #60 pc 0000000000016d5c /system/lib64/chipset-pub-sdk/libbegetutil.z.so(HandleRecvMsg_+344)(b9c1f34172649f7245e7dc7174232239) #61 pc 0000000000016828 /system/lib64/chipset-pub-sdk/libbegetutil.z.so(HandleStreamEvent_+172)(b9c1f34172649f7245e7dc7174232239) #62 pc 0000000000013f00 /system/lib64/chipset-pub-sdk/libbegetutil.z.so(ProcessEvent+108)(b9c1f34172649f7245e7dc7174232239) #63 pc 0000000000013a88 /system/lib64/chipset-pub-sdk/libbegetutil.z.so(RunLoop_+356)(b9c1f34172649f7245e7dc7174232239) #64 pc 0000000000010a70 /system/bin/appspawn(AppSpawnRun+136)(604a04c1e54a21974375103a93f821a8) #65 pc 000000000000e3a0 /system/bin/appspawn(main+764)(604a04c1e54a21974375103a93f821a8) #66 pc 00000000000a0e38 /system/lib/ld-musl-aarch64.so.1(libc_start_main_stage2+64)(50f69125610189bbcc15af4611551cd6) Registers: x0:0000000000000001 x1:0000005ab1017840 x2:0000005a18e44480 x3:000000000000000f x4:0000000000000001 x5:8000000000000000 x6:ff72747360735263 x7:7f7f7f7f7f7f7f7f x8:000000000000063d x9:0000000000000007 x10:00000000000002f4 x11:000000000000063c x12:0000000000000001 x13:0000000000000001 x14:000000000000002d x15:02089c2a2bd5bcc9 x16:0000005a9d0427c0 x17:0000005a1890e344 x18:0000000000000005 x19:0000005a18e44458 x20:0000000014e87b31 x21:0000005a18e44450 x22:000000000000000f x23:0000005bbb384c9f x24:0000005ab1014800 x25:0000000000000001 x26:0000000014e87b31 x27:6372756f7365722f x28:0000000000000001 x29:0000007f56e03e30 lr:0000005a9ccba5bc sp:0000007f56e03d00 pc:0000005a9ccba60c
最新发布
10-14
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值