#鸿蒙通关秘籍#如何正确释放JSVM环境以避免内存泄漏?

HarmonyOS
3天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
星H光PM

在鸿蒙开发中,管理多个JSVM环境时,合理释放资源是避免内存泄漏的重要步骤。以下描述了通过releaseJsCore方法释放JSVM环境的实现过程:

  1. 释放JSVM环境接口

    提供ReleaseJsCore函数,用于通过envId释放指定的JSVM环境:

    cpp static napi_value ReleaseJsCore(napi_env env1, napi_callback_info info) { size_t argc = 1; napi_value argv[1]; napi_get_cb_info(env1, info, &argc, argv, nullptr, nullptr); if (argc < 1) return nullptr;

    uint32_t coreEnvId;
    napi_get_value_uint32(env1, argv[0], &coreEnvId);
    
    if (g_envMap.count(coreEnvId) == 0 ) return nullptr;
    
    if (g_envMap[coreEnvId] != nullptr) {
        std::lock_guard<std::mutex> lock_guard(envMapLock);
        OH_JSVM_CloseEnvScope(*g_envMap[coreEnvId], g_envScopeMap[coreEnvId]);
        g_envScopeMap.erase(coreEnvId);
        OH_JSVM_DestroyEnv(*g_envMap[coreEnvId]);
        g_envMap[coreEnvId] = nullptr;
        g_envMap.erase(coreEnvId);
    
        OH_JSVM_CloseVMScope(*g_vmMap[coreEnvId], g_vmScopeMap[coreEnvId]);
        g_vmScopeMap.erase(coreEnvId);
        OH_JSVM_DestroyVM(*g_vmMap[coreEnvId]);
        g_vmMap[coreEnvId] = nullptr;
        g_vmMap.erase(coreEnvId);
    
        delete [] g_callBackStructMap[coreEnvId];
        g_callBackStructMap[coreEnvId] = nullptr;
        g_callBackStructMap.erase(coreEnvId);
    
        napi_delete_reference(env1, g_callBackMap[coreEnvId]);
        g_callBackMap.erase(coreEnvId);
        g_taskQueueMap.erase(coreEnvId);
    }
    return nullptr;
    

    }

  2. 确保资源的完整释放

    • 关闭环境作用域: 通过OH_JSVM_CloseEnvScope关闭当前环境的作用域。
    • 销毁环境: 使用OH_JSVM_DestroyEnv销毁环境,清理环境相关资源。
    • 关闭虚拟机作用域: 应用OH_JSVM_CloseVMScope关闭虚拟机的作用域。
    • 销毁虚拟机: 调用OH_JSVM_DestroyVM销毁虚拟机实例,释放分配的资源。
    • 删除回调结构和引用: 释放之前存储的JS回调结构及其相关引用。

以上步骤可以确保在使用完核心ID后,相关资源都能够及时被释放,防止出现内存泄漏问题。通过ReleaseJsCore接口,有效管理和释放鸿蒙中的JSVM环境,是保障系统稳定性的重要步骤。

分享
微博
QQ
微信
回复
3天前
相关问题
HarmonyOS 怎么检查内存泄漏
548浏览 • 1回复 待解决