LeakCanary内存泄漏检测原理:
(1).application中注册Activity生命周期onActivityDestory回调,同样的检测fragment也是通过监听Fragment的生命周期,利用fragmentManager.registerFragmentLifecycleCallbacks可以实现Fragment是在onFragmentDestroy()中检测Fragment对象是否泄露。
(2).在回调方法中创建引用队列关联activity弱引用对象KeyedWeakReference实例,并将KeyedWeakReference对象存放在集合中保存
KeyedWeakReference reference = new KeyedWeakReference(activity,referenceQueue);KeyedWeakReference继承自WeakReference
(3).首先遍历集合判断弱引用队列中是否包含activity,如果包含说明对象被回收将其从集合中删除,不包含说明可能存在内存泄漏需要进一步检查
(4).在主线程空闲的时候(Looper.getMainLooper().addIdle())再次检查引用队列中是否包含activity,如果依然不包含,调用System.gc()进行gc回收,因为gc操作不是同步操作,所以sleep(100)ms后再次检查是否发生内存泄漏
(5).发生了内存泄漏:Debug.dumpHprofData(String fileName)文件分析内存泄漏对象到GC root的引用链并发送泄漏信息给RD.
LMK杀死进程优先级
1.前台进程:与用户正在交互的进程
2.可见进程:用户可见但不可交互,比如Activity上弹出对话框这种情境下,Activity虽然可见但失去了焦点
3.服务进程:app处于后台,使用service在播放音乐或者下载文件这种情景下
4.后台进程:app处于后台,页面组件不可见,比如执行了Actity的onStop
5.空进程:app处于后台但是没有活动的组件在运行,空进程存在的目的在于能够快速响应用户点击图标唤醒进程。
当两个应用的进程优先级相同时,LMK优先杀死占有内存高的进程。
监听进程内存状态
两种实现方式
(1).Application和Activity中的onTrimMemory(int level)系统回调,level等级有应用处于前台,系统内存不足,该进程马上要被kill掉等
(2).调用activityManager.getMemoryInfo()查询内存信息,包括应用剩下可用内存,应用总内存以及布尔值的系统是否处于低内存状态等信息。
LocalBordcastManager线程安全的单例实现类,通过handler发送消息切换到主线程来执行,适合进程内通信
Class ReceiverRecord{
BroadcastReceiver receiver;
IntentFilter filter;
boolean broadcasting;
}
class BroadcastRecord{
Intent intent;
ArrayList<ReceiverRecord> receivers;
}
HashMap<BroadcastReceiver, ArrayList<ReceiverRecord>> mReceivers = new HashMap<>();//注册时保存receiver的对应关系
HashMap<String, ArrayList<ReceiverRecord>> mActions = new HashMap<>();//注册时保存action和receiver对应关系,方便发送广播时查找对应的ReceiverRecord,一对多的关系
ArrayList<BroadcastRecord> mPendingBroadcasts = new ArrayList<>();//正在执行的BroadcastReceiver
注册时
registerReceiver(BroadcastReceiver receiver,IntentFiler filter);
保存receiver和ReceiverRecord的对应关系:一对多(因为一个receiver可以对应多个intentFilter)
保存action和ReceiverRecord的对应关系:一对多(因为一个action可以对应多个receiver)
发送广播
sendBroadcast(Intent intent)
从intent中获取action匹配的receiver,然后将receiver加入到执行集合中,发送handler消息开始执行
反注册
unregisterReceiver(BroadCastReceiver receiver)
从两个map集合中删除对应的receiver
网友评论