Android性能优化之内存优化

Android性能优化之内存优化

这篇文章是讲解如何通过对内存优化来实现Android性能优化.与内存优化相对的是内存泄露.
那什么是内存泄露呢?我们都知道不管是Android还是Java,我们new一个对象,当使用完毕之后是不需要像c/c++那样手动用free函数或delete函数去释放这个对象,Java有一个垃圾回收机制(GC)可以自动将不再需要使用对象释放掉,垃圾回收算法这里就不阐述了.而内存泄露的根源就在于Java的垃圾回收算法,由于程序员的某个不正当操作导致了某个不再使用的对象没有被Java的垃圾回收算法检测出来进而没有被回收一直驻留在内存中.假设内存容量是200kb,这个本该被回收的对象是2kb,每创建一个该对象,内存容量就会减少2kb即内存泄露了2kb,但我们创建101个该对象,那就会泄露202kb(大于内存容量200kb),进而导致内存溢出(简单地讲,就是app用着用着就崩了).

刚才有说过:由于程序员的某个不正当操作导致对象不能被回收.一般来说,某个对象不再有任何引用的时候会被gc回收.程序员的这个操作导致了当一个对象已经不需要再使用了本该被回收,而有另一个正在使用的对象持有它的引用从而使该对象不能被回收,驻留在内存中.

什么是对象?什么是引用?看一个例子
ArrayList list=new ArrayList<String>();list是对象的引用;而new ArrayList<String>是对象.对象和引用的概念不要混为一谈,以前我一直认为对象就是引用,结果在学习内存优化的时候踩了不少坑.

Java分配内存的几种策略
1.静态的存储区:内存在程序编译的时候就已经分配好,这块的内存在程序整个运行期间都一直存在.主要存放静态数据,全局的static数据和一些常量
2.栈式的存储区:在执行函数时,函数一些内部变量的存储可以放在栈里创建,函数执行结束时,这些存储单元就会自动释放掉.栈内存分配的速度很快,因为内置在处理器里面,但容量有限。与操作系统有关,一般2mb
3.堆式的存储区:存放用new或者malloc申请分配内存的对象,在c/c++需要自己释放内存,在java中依靠GC机制
在java类中,成员变量全部存储在堆中(包括基本数据类型、引用以及引用的对象实体);局部变量的基本数据类和引用存储在栈中,引用的对象实体存储在堆中.一般占用操作系统80%的内存

  • 内存分析步骤:(自己判断是由什么变量引起的泄露,然后再分析验证)
    1.在Android Monitor中初始化GC,记住Allocated的内存大小
    在这里插入图片描述
    2.持续点击某项操作(该操作之后手机会很卡意味着可能有内存泄露),然后多次gc,若allocated的内存大小比一开始的明显增多,则该操作导致内存泄露(观察红色圈中的数据是否有增加)
    在这里插入图片描述
    3.在点击某项操作之前,先生成prof文件,多次初始化gc之后,再生成prof文件,导入mat分析对比两个文件增加了哪些对象
    在这里插入图片描述
    在这里插入图片描述
    4.将项目中capture文件夹中的prof文件导入mat分析(在这之前要将AS中的.prof文件生成标准的prof文件)
  • mat分析步骤
    1.打开"Histogram",然后将其按照包排序(个人习惯),选中怀疑的对象
    在这里插入图片描述
    在这里插入图片描述
    2.右击"Package/Class"选择排除弱引用、虚引用、软引用
    在这里插入图片描述
    3.找到自己写的类,查看增加了哪些对象.
    在这里插入图片描述
    在这里插入图片描述
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值