HarmonyOS鸿蒙Next中napi开发过程中,遇见内存泄漏问题,要怎么定位解决

HarmonyOS鸿蒙Next中napi开发过程中,遇见内存泄漏问题,要怎么定位解决

如题,每次点击按钮内存都会增加一些,并且主动触发gc也不见回收,napi开发过程中的内存泄漏问题要怎么定位解决。

相关词:napi内存泄漏,内存不回收,内存增长,napi泄漏

3 回复

建议先了解一下napi生命周期相关材料:

使用Node-API接口进行生命周期相关开发-Node-API使用指导-使用Node-API实现跨语言交互-代码开发-NDK开发 - 华为HarmonyOS开发者

使用napi导致内存泄漏的常见原因:

  1. napi_value不在handle_scope管控中,导致native持有的js对象不释放,尤其常见在直接使用uv_queue_work中。解决方案也很简单,加上napi_open_handle_scope和napi_close_handle_scope

易错API的使用规范-稳定性编码规范-稳定性优化-稳定性-应用质量 - 华为HarmonyOS开发者

这种泄漏在snapshot里面也可看出看出端倪,泄漏的js对象distance为1,即不知道被谁持有,这种情况下一般就是被native(napi_value是个指针,指向native持有者)持有了,且napi_value不在handle_scope范围内。

  1. 使用了napi_create_reference为js对象创建了强引用(initial_refcount参数大于0),并且忘记delete了,导致js对象无法一致被持有,无法被回收。napi_create_reference接口会new一个c++对象,因此这种泄漏往往是js和c++双双泄漏。可以使用Allocation工具抓c++泄漏栈,看看是否有napi_create_reference相关栈帧。

基础内存分析:Allocation分析-性能分析-DevEco Studio - 华为HarmonyOS开发者

  1. 被其他存活js对象持有。这时候snapshot看看泄漏对象被谁持有了就行。

更多关于HarmonyOS鸿蒙Next中napi开发过程中,遇见内存泄漏问题,要怎么定位解决的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,napi开发遇到内存泄漏问题,可以通过以下步骤定位和解决:

  • 首先,使用DevEco Studio的内存分析工具检测内存使用情况,查看是否存在未释放的对象。
  • 其次,检查代码中是否有未正确释放资源的地方,如未关闭的文件句柄、未释放的Native对象等。
  • 最后,使用鸿蒙提供的napi接口进行内存管理,确保资源在不再需要时被正确释放。

在HarmonyOS Next的NAPI开发中遇到内存泄漏问题,可以通过以下方法定位和解决:

  1. 使用DevEco Studio的内存分析工具:
  • 通过Profiler工具监控内存变化
  • 重点关注每次操作后的内存增长情况
  • 查看内存分配堆栈信息
  1. 常见泄漏原因:
  • 未正确释放napi_create_reference创建的引用
  • 未处理napi_create_external分配的外部内存
  • 回调函数中未释放资源
  • 循环引用问题
  1. 解决方法:
  • 确保每个napi_create_reference都有对应的napi_delete_reference
  • 为napi_create_external设置合适的finalize回调
  • 使用napi_remove_wrap释放包装对象
  • 检查异步操作中的资源释放
  1. 调试技巧:
  • 在关键节点添加日志输出
  • 逐步注释代码定位泄漏点
  • 使用napi_get_reference_value检查引用计数

建议重点关注对象创建和释放的对称性,特别是跨语言边界的资源管理。

回到顶部