一、内存泄漏
Android的虚拟机是基于寄存器的Dalvik,它的最大堆大小一般是16M,有的机器是24M,因此我们所能利用的内存空间是有限的。如果我们的内存占用超过了一定的水平就会出现OOM
1、资源释放问题
程序代码的问题,长期保持某些资源,如Context、Cursor、IO流的引流,资源得不到释放造成内存泄漏
2、对象内存过大问题
保存了多个好用内存过大的对象(如Bitmap、XML文件),造成内存超出限制
3、static关键字的使用问题
static是Java中的一个关键字,当它用来修饰成员变量时,那么该变量属于与该类,而不是该类的实例。所以用static修饰的变量,它的生命周期很长,如果用它引用一些耗费资源过多的实例,这就要谨慎对待了
解决办法:
a、因该尽量避免static成员变量引用资源耗费过多的实例,比如Context;
b、Context尽量使用ApplicationContext,因为Appcation的Context的生命周期比较长,引用他不会出现内存泄漏的问题;
c、使用WeakReference代替强引用;
4、线程导致内存溢出
主要原因就是线程生命周期的不可控。
解决方案:
a、将线程的内部类,改为静态内部类(因为非静态内部类拥有外部类对象的强引用,而静态类则不拥有)
b、在线程内部采用弱引用保存Context引用
二、OOM
1、图片过大导致OOM
Android中用bitmap是很容易内存溢出
a、等比例缩小图片,这个只能用来优化,并不能彻底解决内存溢出
b、对图片采用软引用,及时地进行recycle()操作
2、界面切换导致OOM
a、看看页面布局中有没有大的图片,比如背景图之类的,去除xml中的相关设置,改在程序中设置背景图片(OnCreate)
b、将xml配置文件加载成view,再放到一个容器里,然后直接调用this.setContentView(View.View)方法,避免xml的重复加载
c、在页面切换时尽可能少的重复的使用一些代码,比如数据库的调用、反复使用某些对象等
3、数据库查询没有关闭游标
4、构造Adapter时,没有使用缓存的convertView
5、bitmap对象不再使用时调用recycle()释放内存
三、未完待续
Android开发中的性能优化
最新推荐文章于 2022-09-17 19:47:19 发布