前言
最近再调人脸识别算法相关demo,发现调试期间总是偶发性崩溃,捕获不到异常的那种,看日志发现原因是Low on memory
,一开始还疑惑 App内存不够应该是OOM
啊,怎么会出现这种问题,百思不得其解,直到我打开了 Android studio中的Profiler
…
开始分析问题
两分零六开始内存直线上升,直到程序被强杀
惊呆了烙铁,这TM的不就是内存泄漏吗,于是开始记录内存快照
emm… Leaks
个数为0,没有泄露,啧啧,不用管它,看下面一眼就看到Bitmap
占用了天文数字的Native
内存,这明显是Bitmap
没有被回收而一直被强引用啊!
知道问题原因解决起来就简单了,我的程序中因为要不停的向人脸识别算法喂Bitmap
,正常的流程是算法处理结束就会及时回收它,巧的是当Bitmap
没有人脸的时候中间一段代码会报错,导致算法不能继续执行下去,就导致了这个Bitmap
已经通过JNI
传进了Native
层而无法正常回收,因为算法处理过程是在子线程中,所以即使子线程崩溃,在你不使用try catch
捕获异常的情况下,你就无法感知到。
乌鱼子,把相关代码异常处理下就正常了
最后
不要好奇为什么这么频繁GC,因为不GC我的程序才不正常。最后提醒一下,大家记得处理好子线程异常情况呀,拜拜ヾ(•ω•`)o