内存监控机制
跟回:BinderInternal.addGcWatcher()
网络异常,图片无法展示
|
这里可能看得你有点迷,但是当你理解了就会觉得很妙了:
虚拟机GC会干掉 WeakReference 的对象,在释放内存前,会调用对象的 finalize(),而这里有创建了一个新的 WeakReference 实例。下次GC,又会走一遍这里的代码,啧啧啧,相比起轮询高效多了
到此,应用内存不足回收Activity的流程就大概缕清了,接着可以写个代码验证下是否真的这样。
Demo验证
先试下两个Task的:
网络异常,图片无法展示
|
模拟内存分配的页面,然后一直点~
网络异常,图片无法展示
|
网络异常,图片无法展示
|
宁愿OOM,也不回收,试试三个~
网络异常,图片无法展示
|
网络异常,图片无法展示
|
好家伙,onDestory()了,此时按Back回退这些页面,发现走了onCreate(),即回收了,接着试试四个的情况:
网络异常,图片无法展示
|
网络异常,图片无法展示
|
可以,每次只回收一个Task,到此验证完毕了~
0x3、结论
- 系统内存不足时,直接在内核层查杀(回收)进程,并不会考虑回收哪个Activity;
- 进程内存不足时,如果此进程 Activity Task数 >= 3 且 使用内存超过3/4,会对 不可见 Task进行回收,每次回收 1个 Task,回收时机为每次gc;