HarmonyOS Native内存暴涨

HarmonyOS Native内存暴涨  -鸿蒙开发者社区解决方案

目前资源调度子系统对前台应用的内存没有限制,只管控进程后台的内存使用异常情况。

资源调度子系统不处理ArkTS占用的内存,Native进程内存占用没有做限制,但是占用过大会有被内核的OOM查杀的风险。

参考链接:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/background-task-overview-V5

HarmonyOS 出现appCrash <a name="section96972295339"></a>

问题描述

pc 00000000005caa9c /system/lib64/platformsdk/libark_jsruntime.so(95b2781bd3970de0ded17d64930b4bc8)
#11 pc 00000000005c75f8 /system/lib64/platformsdk/libark_jsruntime.so(panda::ecmascript::HeapEntryMap::InsertEntry(panda::ecmascript::Node*)+48)(95b2781bd3970de0ded17d64930b4bc8)
#12 pc 00000000005c82b0 /system/lib64/platformsdk/libark_jsruntime.so(panda::ecmascript::HeapSnapshot::HandleBaseClassNode(unsigned long, bool, unsigned int&, panda::ecmascript::TaggedObject*, unsigned long&)+196)(95b2781bd3970de0ded17d64930b4bc8)
#13 pc 00000000005c572c /system/lib64/platformsdk/libark_jsruntime.so(panda::ecmascript::HeapSnapshot::GenerateNode(panda::ecmascript::JSTaggedValue, unsigned long, bool, bool)+864)(95b2781bd3970de0ded17d64930b4bc8)
#14 pc 000000000048c258 /system/lib64/platformsdk/libark_jsruntime.so(panda::ecmascript::SparseSpace::IterateOverObjects(std::__h::function<void (panda::ecmascript::TaggedObject*)> const&) const::$_4::operator()(panda::ecmascript::Region*) const+204)(95b2781bd3970de0ded17d64930b4bc8)
#15 pc 0000000000489a7c /system/lib64/platformsdk/libark_jsruntime.so(panda::ecmascript::SparseSpace::IterateOverObjects(std::__h::function<void (panda::ecmascript::TaggedObject*)> const&) const+96)(95b2781bd3970de0ded17d64930b4bc8)
#16 pc 00000000005c41ac /system/lib64/platformsdk/libark_jsruntime.so(panda::ecmascript::HeapSnapshot::FillNodes(bool, bool)+260)(95b2781bd3970de0ded17d64930b4bc8)
#17 pc 00000000005c4080 /system/lib64/platformsdk/libark_jsruntime.so(panda::ecmascript::HeapSnapshot::BuildUp(bool)+28)(95b2781bd3970de0ded17d64930b4bc8)
#18 pc 00000000005bf4c4 /system/lib64/platformsdk/libark_jsruntime.so(panda::ecmascript::HeapProfiler::MakeHeapSnapshot(panda::ecmascript::HeapProfiler::SampleType, bool, bool, bool, bool, bool, bool)+300)(95b2781bd3970de0ded17d64930b4bc8)
#19 pc 00000000005bf294 /system/lib64/platformsdk/libark_jsruntime.so(panda::ecmascript::HeapProfiler::DoDump(panda::ecmascript::DumpFormat, panda::ecmascript::Stream*, panda::ecmascript::Progress*, bool, bool, bool, bool, bool)+300)(95b2781bd3970de0ded17d64930b4bc8)
#20 pc 00000000005c00a4 /system/lib64/platformsdk/libark_jsruntime.so(panda::ecmascript::HeapProfiler::DumpHeapSnapshot(panda::ecmascript::DumpFormat, panda::ecmascript::Stream*, panda::ecmascript::Progress*, bool, bool, bool, bool, bool, bool, bool)+1080)(95b2781bd3970de0ded17d64930b4bc8)
#21 pc 00000000005bf0cc /system/lib64/platformsdk/libark_jsruntime.so(panda::ecmascript::HeapProfiler::DumpHeapSnapshot(panda::ecmascript::DumpFormat, bool, bool, bool, bool, bool, bool)+172)(95b2781bd3970de0ded17d64930b4bc8)
#22 pc 00000000004436e0 /system/lib64/platformsdk/libark_jsruntime.so(panda::ecmascript::SharedHeap::DumpHeapSnapshotBeforeOOM(bool, panda::ecmascript::JSThread*)+804)(95b2781bd3970de0ded17d64930b4bc8)
#23 pc 00000000002f506c /system/lib64/platformsdk/libark_jsruntime.so(panda::ecmascript::SharedHeap::AllocateHugeObject(panda::ecmascript::JSThread*, unsigned long)+316)(95b2781bd3970de0ded17d64930b4bc8)
#24 pc 00000000002eaffc /system/lib64/platformsdk/libark_jsruntime.so(panda::ecmascript::EcmaString::CreateLineStringWithSpaceType(panda::ecmascript::EcmaVM const*, unsigned long, bool, panda::ecmascript::MemSpaceType)+700)(95b2781bd3970de0ded17d64930b4bc8)
#25 pc 00000000002f7da8 /system/lib64/platformsdk/libark_jsruntime.so(panda::ecmascript::EcmaString::CreateFromUtf8(panda::ecmascript::EcmaVM const*, unsigned char const*, unsigned int, bool, panda::ecmascript::MemSpaceType, bool, unsigned int)+548)(95b2781bd3970de0ded17d64930b4bc8)
#26 pc 000000000050fefc /system/lib64/platformsdk/libark_jsruntime.so(panda::ecmascript::ObjectFactory::NewFrom
HarmonyOS
9天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
aquaa

从#22号栈分析到应用OOM了,见下:

#22 pc 00000000004436e0 /system/lib64/platformsdk/libark_jsruntime.so(panda::ecmascript::SharedHeap::DumpHeapSnapshotBeforeOOM(bool, panda::ecmascript::JSThread*)+804)(95b2781bd3970de0ded17d64930b4bc8)

OOM排查方法如下:

1、排查JS侧的代码,是否存在大量的ArkTS代码的变量没有释放情况,比如将new的对象、内存放到Map中管理而不释放等,参考ArkTS内存泄露分析:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-arkts-memory-leak-analysis-0000001883411885-V5

2、从日志中看到,应用存在的C++库有libisecnet.so、libmobiletoken.so、libohosdrisklib.so、libminizip_ng.so等等,需要排查malloc/new申请的内存,是否存在对应的free/delete释放。

3、排查使用napi_create_arraybuffer、napi_get_arraybuffer_info等napi接口,存在参数是双指针传递的参数,无需申请与释放内存,接口使用举例如下:

void *output_ptr = NULL;
napi_create_arraybuffer(env, byte_length, &output_ptr, &output_buffer); //  第三个参数,无需申请内存,也无需释放内存

4、经过第2、3步的排查,可以将一些明显的内存泄露问题解决降低工具排查压力,工具排查请参考基础内存分析Allocation分析:

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-insight-session-allocations-0000001481625938-V5

也可以直接用第一步的工具排查。

分享
微博
QQ
微信
回复
9天前
相关问题
HarmonyOS 关于内存管理
228浏览 • 0回复 待解决
HarmonyOS 内存泄漏检测
316浏览 • 1回复 待解决
HarmonyOS webview内存占用问题
199浏览 • 1回复 待解决
HarmonyOS napi共享内存指导
204浏览 • 1回复 待解决
HarmonyOS 怎么检查内存泄漏
719浏览 • 1回复 待解决
HarmonyOS onMemoryLevel监听内存变化
63浏览 • 1回复 待解决
HarmonyOS native调试
317浏览 • 1回复 待解决
HarmonyOS 介绍内存管理的文档
298浏览 • 1回复 待解决
HarmonyOS 实时查看App所占内存
141浏览 • 1回复 待解决
HarmonyOS 运行报错,内存不足
767浏览 • 1回复 待解决
HarmonyOS 应用进程的内存分配
344浏览 • 1回复 待解决
HarmonyOS dump本地内存的api
216浏览 • 1回复 待解决
HarmonyOS 获取设备内存的接口
171浏览 • 1回复 待解决
HarmonyOS native断点
124浏览 • 1回复 待解决
如何获取内存coredump
1174浏览 • 1回复 待解决