目录

ASCF元服务如何获取内存快照

问题现象

基于ASCF转换或开发的元服务由于V8引擎内存泄露导致cppCrash,如何获取内存快照来进一步分析内存泄露原因?

报错日志如下:

Process name:com.atomicservice.xxx
Process life time:2776s
Process Memory(kB): 1768423(Rss)
Device Memory(kB): Total 11680680, Free 700668, Available 1866752
Reason:Signal:SIGTRAP(TRAP_BRKPT)
Fault thread info:
Tid:43777, Name:jsvm_thread
#00 pc 0000000001328fd0 /system/lib64/libv8_shared.so(v8::base::OS::Abort()+64)
#01 pc 0000000001320fd8 /system/lib64/libv8_shared.so(v8::base::FatalOOM(v8::base::OOMType, char const*)+84)
#02 pc 0000000001320fd8 /system/lib64/libv8_shared.so(v8::base::FatalOOM(v8::base::OOMType, char const*)+84)
#03 pc 0000000000486018 /system/lib64/libv8_shared.so(v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, v8::OOMDetails const&)+120)

背景知识

ASCF框架运行时分为视图层(Webview),逻辑层(V8引擎),V8引擎存在最大内存限制,超过内存限制后就会出现OOM,最终导致cppCrash。

解决方案

  1. 获取内存快照:在需要保存内存快照的地方添加takeSnapShot()方法,每次调用该方法都会在应用沙箱路径下保存一次当前堆信息,文件名为heap-snapshot-<index>.heapsnapshot,其中index为每次调用后自增的序号。

  2. 内存快照对比:利用浏览器的开发者工具对比前后的内存快照,分析内存增长并且长时间未释放的泄露点。

    首先通过'Load profile'功能上传步骤一获取到的内存快照。

    利用'Comparison'功能对比运行前后内存快照,结合代码分析内存泄漏点。