Android性能优化之内存优化

1、内存溢出的原因

1.1、内存泄漏

内存泄漏和内存溢出的区别:

内存泄漏:程序中存在对无用对象的引用,导致GC无法回收。内存泄漏最终会导致oom。

内存溢出:程序在申请内存时,没有足够的内存空间供其使用,出现out of memory。

1.2、保存多个耗用内存过大的对象

应用的某些逻辑操作消耗掉大量内存(譬如加载一张不经过处理的超大超高清图片等)导致超过阈值。

2、内存优化

2.1、bitmap

1)对bitmap进行压缩

通过BitmapFactory.Options设置inSampleSize采样率,并设置inJustDecodeBounds为true后图片就不会加载进内存,只是计算原始图片的大小,在对图片压缩处理完成之后,在设置为false就可以加载到内存了。

2)对bitmap进行回收

Bitmap 对象不再被使用的时候,调用Bitmap.recycle()方法来释放Bitmap占用的内存空间,并进行空引用,以便gc进行回收。

3)bitmap进行缓存

Bitmap缓存分为两种:一种是内存缓存,一种是硬盘缓存。

内存缓存(LruCache):

LruCache类是非常适合用作缓存Bitmap任务的,它将最近被引用到的对象存储在一个强引用的LinkedHashMap中,并且在缓存超过了指定大小之后将最近不常使用的对象释放掉。

2.2、修改对象引用类型

引用类型:

引用分为四种级别,这四种级别由高到低依次为:强引用>软引用>弱引用>虚引用。

1)强引用(strong reference)

如:Object object=new Object(),object就是一个强引用了。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题。

2)软引用(SoftReference)

只有内存不够时才回收,常用于缓存;当内存达到一个阀值,GC就会去回收它;

3)弱引用(WeakReference)

弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它 所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。

4)虚引用(PhantomReference)

"虚引用"顾名思义,就是形同虚设,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收。

但是对于SoftReference(软引用)或者WeakReference(弱引用)的Bitmap缓存方案,现在已经不推荐使用了。自Android2.3版本(API Level 9)开始,垃圾回收器更着重于对软/弱引用的回收。

2.3、适配器Adapter

1)复用用convertview

复用convertview布局文件的渲染次数,因为每次调用getView时都会重新创建View,这样之前的View可能还没有销毁,加之不断的新建View势必会造成内存泄露;

2)使用ViewHoder模式

使用viewhoder可以减少findviewbyid的次数,因为通过setTag将视图的tag存入一个数据结构,这个数据结构包含了指向我们要绑定数据的视图的引用;

2.4、其他

1)尽量少食用enmu

枚举相对于静态常量来说,需要两倍甚至更多的内存.

2)资源释放

使用数据库,IO流的时候记得关闭资源.

时间: 2024-10-15 10:25:42

Android性能优化之内存优化的相关文章

App性能优化之内存优化

本文为慕课网<App性能优化之内存优化>课程的学习笔记,视频地址 (http://www.imooc.com/video/13670) ## 如何查看一个app在安卓系统中的内存分配情况? 方法一: 1.启动android studio和虚拟机,建立连接. 2.打开cmd窗口,输入adb shell. 3.输入ps.  4.可以看到有一个name为应用包名的进程,这就是我们的app所在的进程  5.为了具体查看app所在进程的内存使用情况,需输入dumpsys meminfo +包名.  方法

转 iOS和android游戏纹理优化和内存优化(cocos2d-x)

iOS和android游戏纹理优化和内存优化(cocos2d-x) (未完成) 1.2d游戏最占内存的无疑是图片资源. 2.cocos2d-x不同平台读取纹理的机制不同.ios下面使用CGImage,android和windows下是直接调用png库.我测试了下,使用png库直接读取png会比CGImage还要节约1mb左右内存(图片所占内存4mb)但是速度要比CGImage慢一倍.时间和空间如何取舍就看实际情况了.不过最佳的选择似乎是pvr(即使android版本,即使不使用pvrtc4).

Android Studido下的应用性能优化总结-内存优化

转载请标明出处(请勿转载删除底部微博.微信等信息): http://blog.csdn.net/Y1258429182/article/details/51176424 本文出自:杨哲丶的博客 上一篇文章总结的布局优化的问题,如果对布局优化不是很熟悉的,可以看一下Android Studido下的应用性能优化总结–布局优化, 这周一直筹划总结一下内存优化的问题,因为现在对于应用优化的文章很多,但是还是想完善一下才想分享这篇文章的,我会从项目中遇到的一个问题,通过解决问题的过程来分享知识,希望大家

Android Studio下的应用性能优化总结-内存优化

转载请标明出处(请勿转载删除底部微博.微信等信息): http://blog.csdn.net/Y1258429182/article/details/51176424 本文出自:杨哲丶的博客 上一篇文章总结的布局优化的问题,如果对布局优化不是很熟悉的,可以看一下Android Studido下的应用性能优化总结–布局优化, 这周一直筹划总结一下内存优化的问题,因为现在对于应用优化的文章很多,但是还是想完善一下才想分享这篇文章的,我会从项目中遇到的一个问题,通过解决问题的过程来分享知识,希望大家

android 开发如何做内存优化

网上看的一篇很好的文章;http://www.gforetell.com/?/question/id-111__uid-focus 不少人认为JAVA程序,因为有垃圾回收机制,应该没有内存泄露.其实如果我们一个程序中,已经不再使用某个对象,但是因为仍然有引用指向它,垃圾回收器就无法回收它,当然该对象占用的内存就无法被使用,这就造成了内存泄露.如果我们的java运行很久,而这种内存泄露不断的发生,最后就没内存可用了.当然java的,内存泄漏和C/C++是不一样的.如果java程序完全结束后,它所有

Android大图加载内存优化(如何防止OutOfMemory)

一.简介 移动设备不断发展的今天,有的人认为内存已经足够大了,不用再管什么内存优化,Java是虚拟机可以帮我维护内存.其实内存空间资源还是很宝贵的,不管手机内存有多大,系统分配给单个应用的内存空间还是很有限的大致有16M,64M,128M等.在Android中加载大图会非常消耗系统资源,16M的图片大致可以存储3张1024X1536质量为ARGB_8888的图片,这里边还不包含其它Object所占的资源.软件在系统上运行,环境是很复杂的,可能测试的时候有限的测试次数上没有发现内存泄漏问题,但是在

2017版:KVM 性能优化之内存优化

我们说完CPU方面的优化,接着我们继续第二块内容,也就是内存方面的优化.内存方面有以下四个方向去着手: EPT 技术 大页和透明大页 KSM 技术 内存限制 1. EPT技术 EPT也就是扩展页表,这是intel开创的硬件辅助内存虚拟化技术.我们知道内存的使用,是一个逻辑地址跟物理地址转换的过程.虚拟机内部有逻辑地址转成成物理地址的过程,然后再跳出来,虚拟机这块内存又跟宿主机存在逻辑到物理的转换.有了EPT技术,那么能够将虚拟机的物理地址直接翻译为宿主机的物理地址,从而把后面那个转换过程去掉了,

python性能优化、内存优化、内存泄露;与其他语音比较效率如何?

1.内存泄露:http://www.cnblogs.com/xybaby/p/7491656.html 2.内存优化:http://www.cnblogs.com/xybaby/p/7488216.html 3.性能提升:http://www.cnblogs.com/xybaby/p/6510941.html 4.与其他语音相比效率如何:http://benchmarksgame.alioth.debian.org/u64q/compare.php?lang=python3&lang2=gpp

Android性能优化(四):内存优化

1.内存的分配策略概述 程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的,对应的,三种存储策略使用的内存空间主要分别是静态存储区(也称方法区).堆区和栈区. 静态存储区(方法区):内存在程序编译的时候就已经分配好,这块内存在程序整个运行期间都存在.它主要存放静态数据.全局static数据和常量. 栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放.栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限. 堆区:亦称动态