标签:
过几天又要去面试了,所以整理一下知识点,以前知道,但是都没仔细想,可能在面试的时候答不全,如果各位觉得除了我总结的之外还有其它情况可以留言,谢谢!
一 什么是内存泄漏?怎么解决?
内存泄漏也称作“存储渗漏”,就是在内存中创建对象开辟的空间,在使用完毕后没有释放,或者无法释放,结果导致该空间一直没有释放。直到程序结束。即所谓内存泄漏。
我总结了以下,内存泄漏的原因:不再有用的对象被其他依然有用的对象所引用是导致内存泄漏的主要原因。
1 查询SQlite数据库后,游标没有关闭。
2 ListView 在设置Adapter的时候没有复用convertView,那么每滚动一次都会去创建一个View对象。
3 Bitmap对象不在使用时 没有调用recycle() 释放内存。
4 对象被生命周期长的对象引用,导致无法被释放,例如Activity 被一个静态集合 引用,即使调用了onDestroy(),也无法回收该对象。(尽量少在别的对象里面申明Activity的对象,能使用Fragment代替的尽量用Fragment 代替)。
5 注册的的广播没有取消。(记得,我们registerReceiver后,一定要在OnDestroy()中unregisterReceiver,这是一套的。)
7 集合中对象没清理造成的内存泄漏。我们通常把一些对象的引用加入到了集合中,当我们不需要该对象时,并没有把它的引用从集合中清理掉,这样这个集合就会越来越大。如果这个集合是static的话,那情况就更严重了。
8 静态变量的生命周期和类是息息相关的,它们分配在方法区上,垃圾回收一般不会回收这一块的内存。所以我们在代码中用到静态对象,在不用的时候如果不赋null值,消除对象的引用的话,那么这些对象是很难被垃圾回收的,如果这些对象一多或者比较大的话,程序出现OOM的概率就比较大了。
内存泄漏的发现:
1 通过DDMS中的heap工具,去发现是否有内存溢出。
2 通过内存分析工具 MAT(Memory Analyzer Tool),找到内存泄露的对象。
内存泄漏如何解决:(解决的话,无非就是针对以上情况取反)
1 在编写应用程序的过程中,对于BraodcastReceiver、ContentObserver、FileObserver在Activity onDestory或者某类声明周期结束之后一定要注销掉,否则这个Activity类会被系统强引用,不会被内存回收。
2 在定义成员变量时,不要直接对Activity进行引用而作为成员变量。就是在别的Activity中定义 MainActivity m;这样即使MainActivity 退出了,对象也回收不了。
3 Bitmap对象不再使用时,调用recycle()方法释放内存。
4 ListView 中ConvertView复用
5 试着使用关于application的context来替代和activity相关的context(建议写一个MyApplication类继承Application,存储一些全局的变量,提供Context,handler等对象)
6 静态变量在不被使用的时候要=null;
7 在对象的引用上做手脚。(软引用,弱引用,虚引用;详情请看:http://www.cnblogs.com/lwbqqyumidi/p/4151833.html)
二 什么是内存溢出?怎么解决 。
内存溢出指 操作所使用的内存大于 虚拟机最大内存,这样就会造成内存溢出。
Android 应用程序的默认最大内存值是16M,(模拟器中VM Heap:16),但是不同手机不同型号可能不同.一旦超过这个值,就会包OOM异常,所以要不停的释放内存。
1 部分原因是由于内存泄漏造成的,内存泄漏导致部分内存没有释放,一直占据着空间,堆积后,可能造成内存溢出。
2 加载大图片(也可能是比较大的其它对象),造成内存溢出
内存溢出的解决:
1 尽力解决内存泄漏。
2 加载大图片的时候,要进行图片的优化,优化的方案:
a 将图片转换成缩略图再加载。
b 降低图片每个像素所占用的内存大小,用ARBG_4444色彩模式加载图片 (默认ARGB_8888,每个像素点占4个byte,而ARGB_4444占2byte)
3 网上有说通过优化 dalvik虚拟机堆 内存(http://blog.csdn.net/t12x3456/article/details/7876668)
面试的时候答出者几点估计也够了,也可以扩展以下,比如谈谈 dalvik虚拟机 内存,如果面试官感兴趣,还可以扯一扯垃圾回收机制了。
我是这样觉得的,各位技术大神,如实觉得还有什么要补充的,可留言,感谢!
标签:
原文地址:http://www.cnblogs.com/chz1992/p/5014883.html