应用为什么崩溃Crash?
性能优化第一篇中的Crash治理说过:“出现Crash应用闪退和崩溃一般有三个原因。
ANR(程序无响应);
Exception(异常);
LMK(低内存杀死机制);
程序停止运行时,会用Throwable类抛出相关信息,其中主要有两类,即error和exception。error是程序无法进行拦截和处理的,如LMK也属于虚拟机抛出的错误。因此只能是防范。
LMK(Low Memory Killer )低内存杀死机制。
由于Android应用的沙箱机制,每个应用程序都运行在一个独立的进程中,各自拥有独立的Dalvik虚拟机实例,系统默认分配给虚拟机的内存是有限度的,当系统内存太低依然会触发LMK机制,即出现闪退、崩溃现象。
heap size限制:即Android默认为每个应用进程分配的最大内存,这个限制在不同的Android版本和设备上可能会有所不同。在较新的Android版本中,默认的heap size限制通常为:应用进程最多可以分配的内存为系统可用内存的一半。
也可以通过在配置清单中application设置属性android:largeHeap=”true”可以突破一定限制。
OOM(OutOfMemoryError)内存溢出错误。
事实上,OOM发生Crash的情况,它并不是导致问题的根本原因,只是一种表象。换句话说,它只是压死骆驼的最后一根稻草。真正导致Crash的有以下原因:
-
内存泄漏:当应用程序中的对象不再使用时,没有正确释放它们所占用的内存,导致内存泄漏。这可能是由于未及时解除对对象的引用、长时间持有大量对象或者循环引用等原因导致。
-
大图像或大数据处理:在Android开发中,处理大图像或大数据时需要占用大量内存。如果没有正确处理这些数据,可能会导致内存溢出。
-
内存抖动:频繁创建对象会导致内存分配和垃圾回收的开销增加,从而增加了内存溢出的风险。尽量避免在循环或频繁调用的代码块中创建大量临时对象。
-
图片缓存不当: