Android性能优化——内存优化

应用APP内存的使用,也是评价一个应用性能高低的一个重要指标。虽然现在智能手机的APP的内存越来越大,但是一个好的应用应当将效率发挥到极致,精益求精。不管什么应用,应该把内存效率、用户体验放在首位。

1.什么是内存?

答:由于Android应用的沙箱机制,每个应用所分配的内存大小是有限度的,内存过低就会触发LMK——Low Memory Killer机制。那么到底什么是内存呢?通常我们说的就是手机的RAM(random access memory 随机存取存储器),它包括以下几部分:

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

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

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

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

常量池(Constant Pool):Java虚拟机必须为每个被装载的类型维护一个常量池(每个类一个常量池)。常量池就是该类型所用到的常量的一个有序的集合,包括直接常量(基本类型,String)和对其他类型、字段和方法的符号引用。

来区分一下堆和栈:

当定义一个变量,JVM就会子啊栈中为该变量分配内存空间,当该变量的作用域结束以后,这部分内存空间就会马上被用作新的空间被分配。如果使用new的方式创建一个变量,那么会在堆中为这个对象分配内存空间,即使该对象的作用域结束了,这部分的内存也不会被立即收回,而是等待系统的GC来进行回收。

堆的大小随着随着手机的发展不断变大,可以用代码来获得堆的大小,所谓内存分析就是分析Heap中的内存状态。

ActivityManager manager = getSystemService(Context.ACTIVITY_SERVICE);
int heapSize = manager.getLargeMemoryClass();
2.获取Android系统内存信息

1>Process Stats

Process Stats是KK上新增的一个系统内存监视服务,可以通过"Setting-Developer optiona-Process Status"来开启该功能的界面。

2>Meminfo

Meminfo也是系统上的一个非常重要的内存监视工具,可以通过在Settings-Apps-Running中打开这一个界面

3.内存的回收

Java对于C、C++这类语言的最大的优势就是不利用手动管理系统资源,Java创建了垃圾收集器线程(GC线程)来自动进行资源管理。这样做的好处是大大降低了程序开发人员对内存管理的繁琐工作。Java的GC是系统自动进行的,但何时进行确是开发者无法控制的,即使调用System.gc()方法也只是建议系统进行GC,但是它采不采用你的建议就不一定了。JVM虽然能够自动控制GC,但是就算在在强大的算法,也难免会存在部分对象忘记回收的现象存在,这就是造成内存泄露的原因。

4.内存优化实例

下面来看两个内存优化的实例,分别从Bitmap和代码的角度对内存进行优化。

Bitmap优化

Bitmap是造成内存占用过高甚至是OOM(Out Of Memory)的最大威胁。

Bitmap是Android系统中的图像处理的最重要的类之一。用它可以获取图像文件信息,进行图像剪切、旋转、缩放等操作。并可以指定格式保存图像文件。

下面给出使用Bitmap的小技巧:

使用适当分辨率和大小的图片

  由于Android系统在做资源适配的时候会对不同分辨率文件夹下的图片进行缩放来适配相应的分辨率,如果图片分辨率与资源文件夹的分辨率不匹配或者图片分辨率太高,就会导致系统消耗更多的内存资源。同时,在适当的时候,应该显示合 适大小的图片,例如,在图片列表界面可以使用图片的缩略图thumbnails,而在显示详细图片的时候再显示原图;或者再对图像要求不高的地方,尽量降低图片的精度。

及时回收内存

一旦使用完Bitmap后,一定要及时使用bitmap.recycle()方法来释放内存资源。自Android 3.0之后,由于Bitmap被放置到了堆中,其内存由GC管理,就不需要进行释放了

使用图片缓存

通过内存缓存(LruCache)和硬盘缓存(DiskLruCache)可以更好的使用Bitmap

代码优化

任何Java类,都将占用大约500字节的内存空间。创建一个类的实例会消耗大约15字节的内存。从代码的实现上,课可以对内存进行优化,同样也总结了一些小技巧:

对常量使用static修饰符

使用静态方法,静态方法会比普通方法提高15%左右的访问速度

减少不必要的成员变量,这点在Android Lint工具上已经集成检测了,如果一个变量可以定义为局部变量,则会建议你不要定义为成员变量

减少不必要的对象,使用基础类型会比使用对象更加节省资源,同时应该避免频繁的创建短作用域的变量

尽量不要使用枚举,少用迭代器

对Cursor、Receiver、Sensor、File等对象,要非常注意对它们的创建、回收与注册、解注册

避免使用IOC框架,IOC通常使用注解、反射来进行实现,虽然现在Java对反射的效率已经进行了很好的优化,但是大量使用反射会带来性能的下降

使用RenderScript、OpenGL来进行非常复杂的绘图操作

使用SurfaceView来代替View进行大量、频繁的绘图操作

尽量使用试图缓存,而不是每次都要执行inflate()方法解析视图

介绍几种工具:

1.Lint工具

Android Lint工具是Android Studio中集成的一个Android代码提示工具,它可以对你的代码和布局提供非常强大的帮助,所以当你写完代码之后,要养成查看Lint的习惯,会发现代码中隐藏的问题

2.Android Studio的Memory Monitior工具

是一个内存监视的工具,可以判断内存的使用状态,如内存持续增高时,可能发生内存泄露;若内存突然减少,则可能发生了GC

3.使用TraceView工具优化APP性能

4.使用MAT工具分析App内存状态




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值