Android内存测试(1)基础知识

1.内存简介

内存简称:Random Access Memeory随机存储器

寄存器:运行速度最快的存储场所,运行在处理器内部,代码无法控制

栈内存:存放基本的数据类型和对象的引用

堆内存:存放由new关键字创建的对象及数组,并且由java虚拟机垃圾回收器(GC)自动管理

静态域:存放静态数据的内存区域

常量池:存放常量的内存区域(如:string 、integer、float等等)

 

2.JAVA中引用类型简介

Java中有常规的引用类型有四个:强引用>软引用>弱引用>虚引用(幽灵引用)

强引用(Strong  Reference

使用new关键字初始化一个对象即为强引用对象。当内存不足时,java虚拟器宁可报出outOfMemeroy错误,使程序终止,也不会对该对象进行回收

 

软引用(Soft re  Reference

只有当内存不足时(满足一个阀值),才会进行回收,常常用于缓存。

 

弱引用(Weak   Reference

弱引用的生命周期更短,在垃圾回收器扫描过程中,一旦发现弱引用的对象,不管当前内存是否足够,都会对该对象进行回收

 

虚引用(Phantom Reference

虚引用(幽灵引用)顾名思义,就是形同虚设,如果一个对象持有一个虚引用,那么它就和没有引用一样,在任何时候都可能被垃圾回收

 

3.Android内存占用的介绍

VSS(Virtual set size):虚拟耗用内存:1.进程占用的内存 2.进程已分配但未使用的内存 3.共享库占用的内存;还包含了不在可能不在RAM中的内存,VSS很少用于判断一个进程的真实内存使用量。

 

RSS(Resident set size):实际使用物理内存:1.进程占用(已使用)的内存2.共享库占用的内存。不管有多少个进程使用共享库,该共享库只会被加载到内存一次,所以RSS并不能准确反映进程的内存占用情况。

 

PSS(Proportional set size):实际使用的物理内存:1、进程占用的内存 2.共享库占用比例分配占用的内存(按照进程个数等比划分)。当前系统中所有进程的PSS相加即可得到

就可以得出当前系统中 总共占用的内存大小。

 

USS(Unique set size):进程独自占用的物理内存(不包含共享库的内存),当该进程被销毁后,该进程所占的USS会真实的返回给系统内存,当内存中存在内存泄漏时,USS是最佳的观察数据

 

总结:VSS>=RSS>=PSS>=USS

4.栈与堆的对比

栈:当定义一个变量时,此时会在栈内存中为这个变量分配内存空间,当该变量退出作用域后,java会自动的释放该变量所占的内存空间,该内存可立即另作它用。

 

堆:存放对象和数组的内存区域,当出其作用域后,不会马上被释放,只有在没有引用变量指向他们的时候才会变成垃圾,即使这样也不会立即被回收,而是要根据垃圾回收器的策略,等待被垃圾回收器回收

 

总结:

1、栈与堆存储的数据类型不一样

2、栈与堆的回收机制不一样

3、栈内存的存取速度(仅次与寄存器)远比堆内存要快

4、栈内存的空间是可以共享的。

根据以上的说明,可以得出内存优化及内存测试的主要关注点在于,堆内存中的数据在需要被释放时,能够被回收。

 

5.内存泄漏的定义

当一个对象不再被使用了,本应该被回收时,但由于另外一个对象持有了它的引用从而导致,这种本该本回收的对象一直停留在堆内存中,就产生了内存泄漏。

6.常见的Android内存问题

1、内存泄漏

       单例(一般单例都属于全局的,有时会引用一些生命周期较短的变量,引起泄漏)

       静态变量(同单例一样,也是因为生命周期问题引起的泄漏)

       线程泄漏(内部类持有外部类的引用 引起的泄漏)

       Handler泄漏(匿名内部类持有外部类引用,引起的泄漏)

       资源使用后未关闭泄漏(如:File、cusor、BroadcastReceiver、ContentObserver)

2、图片分辨率相关

       不同分辨率加载到内存中的大小有很大的区别,如:1280*720照片放在xhdpi中的内存是3点多兆,而在xxhdpi中可能拿到的分辨率就是1920*1080,且内存是8点多兆,相差近5M。

3、图片压缩

       1.像素的压缩

       2.图片色彩模式(如:ARGB_888 通常每个像素占用4个字节,而对于一些没有透明度 要求的图片可以采用RGB_565,每个像素占用2个字节,单张图片直接可以节省50%内存)

4、图片缓存池大小

       缓存池设置太大会造成不必要的内存浪费,设置太小会造成图片频繁的被回收,所以必须要计算出一个比较合理初始值

5、内存抖动

       频繁的回收和分配内存即为内存抖动,且频繁GC还会导致卡顿(因为GC时会暂停所有线程)

 

7.常见Android内存优化点

1、图片内存优化 ->像素优化 分为ARGB_4444(每个像素占用2字节)、ARGB_8888(每个像素占用4个字节)  PS:占用越高显示越细腻,不过在当前手机市场环境下 像素的优化已经不是必须点了(都追求高质量的显示效果)

2、及时的释放图片

3、图片缓存优化 ->Bitmap过多时,需要一次性加载时可以使用软引用进行保存,从而避免OOM(采用LruCache方案对图片进行内存的缓存,LruCache的原理是,当内存不足时会将最近不常用的图片释放掉)

4、尽量避免静态成员变量持有资源过大的实例,如context,因为context的引用生命周期超过context本身的生命周期,就会造成context内存泄漏

5、尽量避免使用枚举(因为枚举占用内存资源较大)

6、输入/输出流及时关闭

7、高频率输出拼接的字符串LOG信息,也可能会造成OOM(建议使用StringBuffer或者StringBuilder替代String)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值