浅谈Android应用性能之内存

时间:2022-05-06 12:47:08

本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处!

文/ jaunty

[博主导读]在Android开发中,不免会遇到许多OOM现象,一方面可能是由于开发者能力有限,对控件使用不熟悉,另一方面架构师前期未未做及时培训,规避一些恶性代码、及时手动回收内存。不管怎样,项目完成还是要发布的,周期有限,后期优化工程师为解决此问题,则需要对项目整体进行把握,从微调开始,对项目进行手术。那么切入正题:

如何测试一个APP的内存占用情况?一个APP占用的内存分哪些部分?如何检查一个APP是否存在内存泄漏?

一、Android内存介绍:

在java开发过程中,是通过new来为对象分配内存的,而内存的释放是由垃圾收集器(GC)来回收的,在开发的过程中,不需要显式的去管理内存,java虚拟机会自动帮我们回收内存。但是这样有可能在不知不觉中就会浪费了很多内存,最终导致java虚拟机花费很多时间去进行垃圾回收,更严重的是造成JVM的OOM。

二、APP占用的内存分哪些

Android系统中的内存和linux系统一样,存在着大量的共享内存。每个APP占内存会有私有和公共的两部分:ShareDirty、PrivateDirty。Pss是考虑共享内存的内核计算尺度 — 基本上一个进程的每个内存页面被按一个比率缩减,这个比率和同样使用该页面的其他进程的数量有关。理论上你可以累计所有进程的Pss占用量来检查所有进程的内存占用量,也可以比较进程的Pss来大致发现进程各自的权重。PrivateDirty,它基本上是进程内不能被分页到磁盘的内存,也不和其他进程共享。

手机中系统设置里有可以查看正在运行的应用程序所占的内存,此处显示的内存为该进程所占用的Total Pss。所以我们只需要查看Total Pss的值就可以知道该应用运行时所占的内存的大小。

三、如何查看一个APP占用的内存

查看内存大致上有三种方法:

1. 通过系统设置查看

在系统设置中->应用->正在运行->APP

优点:操作简单

缺点:数值不准确,无法实时查看数值变化

2. 通过命令行查看

adb shell dumpsys meminfo yourpakagename

结果如下图所示

浅谈Android应用性能之内存

其中Pss对应的TOTAL值为内存所实际占用的值

优点:简单方便,数据全面精确

缺点:无法实时查看内存占用

3. 通过系统API查看

首先通过activitymanager获得正在运行的程序列表,找到所要获取的程序的pid。

activitymanager.getRunningAppProcesses()

再通过memoryinfo[0].getTotalPss();方法获得实际内存占用

Memoryinfo中还包括getTotalPrivateDirty和getTotalSharedDirty方法

优点:可拓展性高,可以通过程序实时查看内存的占用;数据全面精确

缺点:需要具有开发能力,入手较为困难

所以我们现在在测试内存的时候,是使用了内部自己研发的一款APP来监测内存的,这个APP目前可以实现实时监测并记录数据结果,可以提供给开发者和测试者分析内存的数据支持。目前仍然属于内测阶段,以后有机会可以提供给大家使用。

四、内存泄漏

何为内存泄漏?内存泄漏也称作“存储渗漏”,用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元,直到程序结束。

内存泄漏的实例:

btn.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View arg0) {

for (int i = 0; i < 100; i++) {

ImageView img = new ImageView(MainActivity.this);

img.setImageResource(R.drawable.ic_launcher);

test.add(img);

}

}

});

其中test为静态的List<ImageView>。

这样,如果一直点击btn就会出现内存泄漏的情形。

我们如何去监测内存泄漏呢?

例:

以上面内存泄漏的例子为测试Activity,当点击按钮后,会向一个静态数组中添加图片,这样就形成了一个内存泄漏的场景。

进入测试Activity,在点击按钮前先记录当前APP所占用的内存,然后点击按钮。等待操作执行完成后,进行一次GC,再查看APP所占用的内存。

返回后APP所占用的内存没有明显的回落,表明在代码中可能存在内存泄漏的情况发生。

即:在执行某种操作后进行一次GC,内存没有明显的回落。此时即可以断定代码中可能存在内存泄漏。

检测方法:

  1. 通过上文所用的三种方法去查看内存的使用情况
  2. 使用DDMS中的Heap:

1)      打开DDMS并打开Devices视图和Heap视图

2)      点击选择要监控的进程

3)      选中Devices视图界面上的”update heap” 图标

4)      点击Heap视图中的”Cause GC” 按钮(相当于进行了一次GC的操作)

一般我们会观察Data Object的Total值,正常情况下在每次GC后,这个值都会有明显的回落并会稳定在一个范围之内,说明代码中没有未被释放的内存;若这个值在每次GC后没有出现明显的回落,则说明代码中可能存在没有被释放的内存。

总述:内存不仅是性能测试时需要关注的,作为优秀的开发工程师更应该关注自己的代码内存占用的情况,这样可以尽量避免OoM的情况发生。要知道手机分配给每个进程的内存并不多,当系统内存不够的时候会kill掉一些占内存高的进程,所以为了不被系统kill掉我们要尽可能的合理使用内存避免内存泄漏的情况发生。

转自:http://blogs.360.cn/blog/浅谈android应用性能之内存/

浅谈Android应用性能之内存的更多相关文章

  1. 浅谈android应用性能之内存(转)

    如何测试一个APP的内存占用情况?一个APP占用的内存分哪些部分?如何检查一个APP是否存在内存泄漏? 一.Android内存介绍: 在java开发过程中,是通过new来为对象分配内存的,而内存的释放 ...

  2. 浅谈Android Studio3&period;0更新之路(遇坑必入)

    >可以参考官网设置-> 1 2 >> Fantasy_Lin_网友评论原文地址是:简书24K纯帅豆写的我也更新一下出处[删除]Fa 转自脚本之家 浅谈Android Studi ...

  3. 浅谈android代码保护技术&lowbar; 加固

    浅谈android代码保护技术_加固 导语 我们知道Android中的反编译工作越来越让人操作熟练,我们辛苦的开发出一个apk,结果被人反编译了,那心情真心不舒服.虽然我们混淆,做到native层,但 ...

  4. 浅谈Android应用保护(一):Android应用逆向的基本方法

    对于未进行保护的Android应用,有很多方法和思路对其进行逆向分析和攻击.使用一些基本的方法,就可以打破对应用安全非常重要的机密性和完整性,实现获取其内部代码.数据,修改其代码逻辑和机制等操作.这篇 ...

  5. 安卓开发&lowbar;浅谈Android动画(四)

    Property动画 概念:属性动画,即通过改变对象属性的动画. 特点:属性动画真正改变了一个UI控件,包括其事件触发焦点的位置 一.重要的动画类及属性值: 1.  ValueAnimator 基本属 ...

  6. 浅谈Android五大布局

    Android的界面是有布局和组件协同完成的,布局好比是建筑里的框架,而组件则相当于建筑里的砖瓦.组件按照布局的要求依次排列,就组成了用户所看见的界面.Android的五大布局分别是LinearLay ...

  7. &lbrack;原创&rsqb;浅谈H5页面性能优化方法

    [原创]浅谈H5页面性能优化方法 前阶段公司H5页面性能测试,其中测试时也发现了一些性能瓶颈问题,接下来我们在来谈谈H5页面性能优化,仅仅是一些常用H5页面性能优化措施,其实和Web页面性能优化思路大 ...

  8. &lbrack;转&rsqb;浅谈Android五大布局(二)——RelativeLayout和TableLayout

    在浅谈Android五大布局(一)中已经描述了LinearLayout(线性布局).FrameLayout(单帧布局)和AbsoulteLayout(绝对布局)三种布局结构,剩下的两种布局Relati ...

  9. &lbrack;转&rsqb;浅谈Android五大布局(一)——LinearLayout、FrameLayout和AbsoulteLayout

    Android的界面是有布局和组件协同完成的,布局好比是建筑里的框架,而组件则相当于建筑里的砖瓦.组件按照布局的要求依次排列,就组成了用户所看见的界面.Android的五大布局分别是LinearLay ...

随机推荐

  1. 链队列java实现

    public class LinkHeap<T> { class Node<T> { T data; Node<T> next; Node(T data) { th ...

  2. css3样式控制(鼠标滑过 显示标注信息)

    <div class="item"> <h1>A</h1> <div class="tooltip"> < ...

  3. Win10&sol;UWP开发—使用Cortana语音指令与App的前台交互

    Win10开发中最具有系统特色的功能点绝对少不了集成Cortana语音指令,其实Cortana语音指令在以前的wp8/8.1时就已经存在了,发展到了Win10,Cortana最明显的进步就是开始支持调 ...

  4. 利用Xstream注解生成和解析xml

    实体类: @XStreamAlias("person") public class PersonBean {     @XStreamAlias("firstName&q ...

  5. 如何优化C语言代码&lpar;程序员必读&rpar;

    1.选择合适的算法和数据结构 应该熟悉算法语言,知道各种算法的优缺点,具体资料请参见相应的参考资料,有很多计算机书籍上都有介绍.将比较慢的顺序查找法用较快的二分查找或乱序查找法代替,插入排序或冒泡排序 ...

  6. 杨氏矩阵 leecode 提

    提交网址https://oj.leetcode.com/problems/search-a-2d-matrix/ 有个矩阵中的数,从左向右递增,从上而下递增,快速查找是一个数是是否存在,剑指offer ...

  7. iPhone 被同步到 Mac上后 如果不希望更新到Mac上在哪里删除?

    前往文件夹   /Users/用户名/Library/Application Support/MobileSync  直接删除  就行了(同时要倾倒废纸篓). 目前iPhone链接Mac 后  不让 ...

  8. mysql&plus;php&plus;pdo批量添加大数据

    1.使用insert into插入 ini_set('max_execution_time','0');//限制超时时间,因为第一种时间较长,索性设为0不限制 $pdo = new PDO(&quot ...

  9. 【ECHART】实例

    1. 带timeline   datazoom的例子 <!doctype html> <html> <head> <meta http-equiv=&quot ...

  10. linux线程 join&sol;detach

    linux中创建线程时,可以通过 __attr 指定线程的属性 extern int pthread_create (pthread_t *__thread, __const pthread_attr ...