编辑: cyhzg | 2019-07-15 |
DelayedMessage - ->
handler(message.target) -->
Activity(内部类隐式引用) 或者子线程中的延时任务(因为还在 虚拟机栈里面,可达性分析的起点)持有着Handler的引用同理. 预防的方法: 在Activity退出的时候关闭子线程,或者Handler的removeCallbacks()把消息清理掉 把隐式的强引用转成显式的弱引用 使用静态内部类,静态内部类不隐式持有外部引用 显式的写一个Activity的WeakReference 面试
10 Android Oom 是如何解决? 1. 使用更加轻量的数据结构 例如,我们可以考虑使用ArrayMap/SparseArray而不是 HashMap等传统数据结构.通常的HashMap的实现方式更加消耗内存,因为它需要一个 额外的实例对象来记录Mapping操作.另外,SparseArray更加高效,在于他们避免了对 key与value的自动装箱(autoboxing),并且避免了装箱后的解箱. 2. 避免在Android里面使用Enum Android官方培训课程提到过 Enums often require more than twice as much memory as static constants. You should strictly avoid using enums on Android. ,具体原理请参考《Android性能优化典范
(三)》,所以请避免在Android 里面使用到枚举.不仅dexcode的大小会增加,连运行时内存也要占用更多 3. 减小Bitmap对象的内存占用 Bitmap是一个极容易消耗内存的大胖子,减小创建出来的 Bitmap的内存占用可谓是重中之重,,
通常来说有以下2个措施: inSampleSize:缩放 比例,在把图片载入内存之前,我们需要先计算出一个合适的缩放比例,避免不必要的 大图载入. decode format:解码格式,选择 ARGB_6666/RBG_545/ARGB_4444/ALPHA_6,存在很大差异 4. Bitmap对象的复用 缩小Bitmap的同时,也需要提高BitMap对象的复用率,避免频繁创建 BitMap对象,复用的方法有以下2个措施 LRUCache : 最近最少使用算法 在Android中有 极其普遍的应用.ListView与GridView等显示大量图片的控件里,就是使用LRU的机制来 缓存处理好的Bitmap,把近期最少使用的数据从缓存中移除,保留使用最频繁的数据, inBitMap高级特性:利用inBitmap的高级特性提高Android系统在Bitmap分配与释放执行效 率.使用inBitmap属性可以告知Bitmap解码器去尝试使用已经存在的内存区域,新解码 的Bitmap会尝试去使用之前那张Bitmap在Heap中所占据的pixel data内存区域,而不是去 问内存重新申请一块区域来存放Bitmap.利用这种特性,即使是上千张的图片,也只会 仅仅只需要占用屏幕所能够显示的图片数量的内存大小 5. 使用更小的图片 在涉及给到资源图片时,我们需要特别留意这张图片是否存在可以压缩 的空间,是否可以使........