android app内存优化

来源:互联网 发布:clipstudiopaint mac 编辑:程序博客网 时间:2024/06/05 19:43

其实这个APP内存优化也就是性能上的优化,这么说可能不太严谨哈,但是我认为在编码阶段应当尽量避免出现内存上的问题,在开发+测试阶段避开这些问题的出现, 以免为客户带来无法挽回的损失

内存简介


RAM(random access memory)随机存取存储器。说白了就是内存。

一般Java在内存分配时会涉及到以下区域:

寄存器(Registers):速度最快的存储场所,因为寄存器位于处理器内部,我们在程序中无法控制

栈(Stack):存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中

堆(Heap):堆内存用来存放由new创建的对象和数组。在堆中分配的内存,由Java虚拟机的自动垃圾回收器(GC)来管理。

静态域(static field): 静态存储区域就是指在固定的位置存放应用程序运行时一直存在的数据,Java在内存中专门划分了一个静态存储区域来管理一些特殊的数据变量如静态的数据变量

常量池(constant pool):虚拟机必须为每个被装载的类型维护一个常量池。常量池就是该类型所用到常量的一个有序集和,包括直接常量(string,integer和floating point常量)和对其他类型,字段和方法的符号引用。

非RAM存储:硬盘等永久存储空间

下面介绍下我们常用的名词吧

OOM

内存泄漏可以引发很多问题

1.程序卡顿,相应速度蛮(内存占用高时JVM虚拟机就会频繁触发GC)

2.莫名消失(当你的程序所占的内存越大,他在后台的时候就越可能被干掉,反之在内存占用越小,在后台存在的时间就越长)

3.直接崩溃(OutOfMemoryError)

Android内存面临的问题:

1.有限的堆内存,原始只有16M

2.内存大小消耗等根据设备,操作系统等级,屏幕尺寸的不同而不同

3.程序不能直接控制

4.支持后台多任务处理(multitasking)

5.运行在虚拟机智商

那么我们如何优化呢,换句话说,我们如何避免呢

一、尽量减少Service的使用:

当你的app需要使用service来处理后台任务的时候,要保证当前的任务完成时,该service也要停止。另外,要注意的是,当停止这个service的时候,不要引起它的泄漏。

当启动一个service之后,系统总会保持这个service处于运行状态。这样,就会占用大量的RAM。所以,app的运行效率就会因此降低。

保留没有用的service最可怕的内存管理错误。所以,一定要牢记,没有必要使用service的时候就不用,用完了一定要记得将它销毁,,,,

二、当界面变为不可见时,要记得释放内存:

当用户跳转到其他界面时,并且当前界面不再可见的时候,要记得释放当前这个界面中的资源。

当用户退出某个界面时,记得在你的activity中实现onTrimMemory()(api4.0及以上)这个回调方法。调用这个方法,系统会收集不需要的内

三、当内存变少时,释放内存:

在你的app运行过程中,当运行该app的设备所剩的RAM变得很少时,系统就会调用onTrimMemory()这个方法,这个方法中有几个参数,表示不同的状态。onTrimMemory()的具体使用,还请大家参加Android的开发文档吧,本人手懒,就不详细介绍啦。

四、检查你所需要使用的内存:

可以通过getMemoryClass()估计一下你的app可用的heap。当你的app所需要的内存超过了这个可用值时,好了内存溢出就出现了。

这里有一个很特殊的方法,可以通过在manifest 标签中将largeHeap的属性值设置为true来请求更大的内存,主要注意的是,如果你采用了这种方法,那么当你想要获取可用内存时,就要使用 getLargeMemoryClass()。

不过由于每台机器的RAM是有限的,所以用这个还是小心吧,不需要用的时候还是不用了吧。

五、避免由bitmap引起的内存浪费(其实当Json数据超过1M的时候也是有一定风险的):

bitmap还是很占内存的啊,当我们使用它的时候一定要小心。有几个需要注意的方法:

1、不要直接使用这样会占用很大的内存,使用BitmapFactory.Options设置inSampleSize,根据手机屏幕大小来设置bitmap的大小, 这样做可以减少对系统资源的要求。

2、缓存图像到内存,采用软引用缓存到内存,而不是在每次使用的时候都从新加载到内存;

3、采用低内存占用量的编码方式,比如Bitmap.Config.ARGB_4444比Bitmap.Config.ARGB_8888更省内存;

4、最后就是最重要的一点,当bitmap使用完之后一定要记得回收,,,

六、使用优化过的数据容器

尽量使用 SparseArray, SparseBooleanArray, LongSparseArray 等经过优化的容器类。通常来说HashMap的效率时比较低下的。

七、小心使用抽象类(方法)

适当的使用抽象类和方法能够使我们的代码更加灵活、易维护,但是这样会增加app的内存占用。所以,那些无关痛痒的东西,还是别抽象了。

这些也都是我在网上参考各种帖子总结出来的,在这里记录一下,欢迎大家转载

1 0
原创粉丝点击