作者:字节跳动终端技术—李权飞
资源溢出是什么?
毫无疑问,应用的运行需要占用系统的资源。其中最为人所熟知的资源是内存,内存溢出便是耳熟能详的OOM。
常见的简单OOM一般可以通过堆栈来解决,如Java OOM,一部分可以直接从堆栈中看到哪里使用了多大内存导致了内存溢出,复杂一些的Java OOM,则可以使用其他分析工具来进行处理。但如果堆栈里看不出来呢?或者它不是Java崩溃呢?
java.lang.OutOfMemoryError: Failed to allocate a 3237132 byte allocation with 1612328 free bytes and 1574KB until OOM
比如下面这样的Native崩溃,堆栈全是系统堆栈,不花时间去研究就很难确定此崩溃的原因(事实上这个崩溃也是一个OOM)。尤其是,我们并不能说这是系统代码的问题。
接下来本文将会介绍,对于这类崩溃如何进行识别、以及解决。
内存溢出(俗称OOM)
如下case:
Signal 6(SIGABRT), Code -1(SI_QUEUE)
#00 pc 000604de /apex/com.android.runtime/lib/bionic/libc.so (abort+165)
#01 pc 0003606d /system/lib/libc++.so (abort_message+88)
#02 pc 000361f1 /system/lib/libc++.so (_ZL28demangling_terminate_handlerv+160)
#03 pc 00045e4b /system/lib/libc++.so (_ZSt11__terminatePFvvE+2)
#04 pc 00045653 /system/lib/libc++.so (_ZN10__cxxabiv1L12failed_throwEPNS_15__cxa_exceptionE+12)
#05 pc 000455b5 /system/lib/libc++.so (__cxa_throw+72)
#06 pc 00047c6d /system/lib/libc++.so (_Znwj+52)
#07 pc 0000132b /system/lib/libbinderthreadstate.so (_ZNSt3__15dequeIN7android18IPCThreadStateBase9CallStateENS_9allocatorIS3_EEE19__add_back_capacityEv+186)
#08 pc 0000120b /system/lib/libbinderthreadstate.so (_ZNSt3__15dequeIN7android18IPCThreadStateBase9CallStateENS_9allocatorIS3_EEE12emplace_backIJRS3_EEES8_DpOT_+52)
#09 pc 0000115f /system/lib/libbind