Android应用性能 分析

标签: android 应用 性能 | 发表时间:2013-11-27 20:09 | 作者:chuangzaozhe1
出处:http://blog.csdn.net

  其实主要是内存方面,内存管理是个永恒的话题!

1.从工具DDMS中,在Sysinfo的tab栏里面有一个Memory usage的选项,通过USB连接Android设备以后很容易抓到图。
在图中可以看到系统随时可以用的内存是Free和Buffers两项,因为我抓图的系统只有128M的内存,所以看上去这部分可用内存已经很少了。

2.通过Linux的/proc文件系统的meminfo来分析这个系统的内存使用情况更客观。之所以这么说,是因为通过这种方法可以绕开繁琐的dalvik实现机制,以系统的层面来分析:

C:\Users\Administrator>adb shell
shell@android:/ $ cat /proc/meminfo
cat  /proc/meminfo
MemTotal:         999008 kB
MemFree:          157532 kB
Buffers:              41308 kB
Cached:             319584 kB
SwapCached:            0 kB
Active:               488128 kB
Inactive:            167012 kB
Active(anon):     292356 kB
Inactive(anon):     3544 kB
Active(file):       195772 kB
Inactive(file):    163468 kB
Unevictable:        1520 kB
Mlocked:           13684 kB
HighTotal:         529408 kB
HighFree:          61680 kB
LowTotal:          469600 kB
LowFree:           95852 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:        295816 kB
Mapped:            165768 kB
Shmem:               360 kB
Slab:                  27752 kB
SReclaimable:       9524 kB
SUnreclaim:        18228 kB
KernelStack:        8232 kB
PageTables:         9628 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:       499504 kB
Committed_AS:    5690380 kB
VmallocTotal:      540672 kB
VmallocUsed:      139020 kB
VmallocChunk:      98112 kB
shell@android:/ $

对于Linux系统来说,可以立即使用的内存是 MemFree+Buffers+Cache,

我们从DDMS中拿到的图差很多。或者说Google隐藏了cache,没有给我我想要的东西;Android系统为了加快系统的运行速度会在系统允许的情况下,大量的使用内存作为应用程序的cache。而当系统内存紧张的时候,会首先释放cache的内存,

3、Android内存介绍:
在java开发过程中,是通过new来为对象分配内存的,而内存的释放是由垃圾收集器(GC)来回收的,在开发的过程中,不需要显式的去管理内存,java虚拟机会自动帮我们回收内存。但是这样有可能在不知不觉中就会浪费了很多内存,最终导致java虚拟机花费很多时间去进行垃圾回收,更严重的是造成JVM的OOM。
4、APP占用的内存分哪些:
Android系统中的内存和linux系统一样,存在着大量的共享内存。每个APP占内存会有私有和公共的两部分:ShareDirty、PrivateDirty。Pss是考虑共享内存的内核计算尺度 — 基本上一个进程的每个内存页面被按一个比率缩减,这个比率和同样使用该页面的其他进程的数量有关。理论上你可以累计所有进程的Pss占用量来检查所有进程的内存占用量,也可以比较进程的Pss来大致发现进程各自的权重。PrivateDirty,它基本上是进程内不能被分页到磁盘的内存,也不和其他进程共享。
手机中系统设置里有可以查看正在运行的应用程序所占的内存,此处显示的内存为该进程所占用的Total Pss。所以我们只需要查看Total Pss的值就可以知道该应用运行时所占的内存的大小。
5、如何查看一个APP占用的内存,查看内存大致上有三种方法:
1. 通过系统设置查看
在系统设置中->应用->正在运行->APP
优点:操作简单
缺点:数值不准确,无法实时查看数值变化
2. 通过命令行查看
adb shell dumpsys meminfo  yourpakagename
其中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,内存没有明显的回落。此时即可以断定代码中可能存在内存泄漏。
检测方法:
通过上文所用的三种方法去查看内存的使用情况
使用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://blog.csdn.net/innost/article/details/9008691 )

作者:chuangzaozhe1 发表于2013-11-27 12:09:46 原文链接
阅读:30 评论:0 查看评论

相关 [android 应用 性能] 推荐:

Android应用性能 分析

- - CSDN博客推荐文章
  其实主要是内存方面,内存管理是个永恒的话题. 1.从工具DDMS中,在Sysinfo的tab栏里面有一个Memory usage的选项,通过USB连接Android设备以后很容易抓到图. 在图中可以看到系统随时可以用的内存是Free和Buffers两项,因为我抓图的系统只有128M的内存,所以看上去这部分可用内存已经很少了.

Android应用性能测试

- - CSDN博客推荐文章
java虚拟机有内存使用上限的限制. adb shell进入手机,这此参数被纪录在/system/build.prop中,如果想直接查看可以使用adb shell getprop. 单个应用程序最大内存限制,超过这个值会产生OOM. 单个java虚拟机最大的内存限制,超过这个值会产生OOM. android程序内存一般限制在16M,当然也有24M的,而android程序内存被分为2部分:.

基于 PhoneGap 与 Java 开发的 Android 应用的性能对比

- jinn - 搜索研发部官方博客
        此次的调研的重点是针对一个Android应用的基础需求,用phonegap与Java实现的应用在性能及开发成本等方面的对比.        开发一个应用的最基本需求应该是浏览性需求,而在Android开发中ListView比较常用的控件,广泛被用于数据列表的展现上,而且也比较灵活. 所以本次选择用phonegap和Java各自实现一个ListView的内容展现功能的应用;同时引入另外一个常用组件GridView来实现图片浏览的功能应用.

Android应用程序运行的性能设计

- - CSDN博客推荐文章
Android应用程序运行的移动设备受限于其运算能力,存储空间,及电池续航. 电池续航可能是一个促使你优化程序的原因,即使他看起来已经运行的足够快了. 由于续航对用户的重要性,当电量耗损陡增时,意味这用户迟早会发现是由于你的程序.   虽然这份文档主要包含着细微的优化,但这些绝不能成为你软件成败的关键.

Android应用开发性能优化完全分析

- - CSDN博客推荐文章
其实有点不想写这篇文章的,但是又想写,有些矛盾. 当然了,本文不会就此编辑这么一次,因为技术在发展,工具在强大(写着写着Android Studio 1.4版本都推送了),自己的经验也在增加,所以本文自然不会覆盖所有性能优化及分析;解决的办法就是该文章会长期维护更新,同时在评论区欢迎你关于性能优化点子的探讨.

GetEd2k (Android应用)

- 某牢 - eMule Fans 电骡爱好者
GetEd2k是一个Android应用程序,作者是anacletus. 此应用可以帮助你把网页中的电驴(eDonkey) 链接添加到你个人电脑的电驴客户端里,不过前提是你的客户端开启了用于远程控制的Web interface(Web服务器,网页接口,Web界面),当然,eMule(电骡), MLDonkey 和 aMule 都支持该功能,所以这三种主流电驴客户端的用户都可以使用GetEd2k.

Android 性能优化

- - CSDN博客综合推荐文章
如果应用程序需要使用Service来执行后台任务的话,只有当任务正在执行的时候才应该让Service运行起来. 当启动一个Service时,系统会倾向于将这个Service所依赖的进程进行保留,系统可以在LRUcache当中缓存的进程数量也会减少,导致切换程序的时候耗费更多性能. 我们可以使用IntentService,当后台任务执行结束后会自动停止,避免了Service的内存泄漏.

Android 应用程序

- - CSDN博客推荐文章
Android 应用程序由四个模块构造而成:Activity、Intent 、Content Provider 、Service. 下面简单介绍一下如下模块的含义:. 1、Activity  "活动". 一个Activity就是单独的屏幕,每一个活动都被实现为一个独立的类,并且从活动基类中继承而来,活动类将会显示由视图控件组成的用户接口并对事件作出响应.

android应用框架

- - CSDN博客移动开发推荐文章
原文地址:http://developer.android.com/guide/components/fundamentals.html. android应用程序一旦装进设备,每个程序会在它自己安全的沙盒里运行. 1.android操作系统是一个多用户linux系统,每一个应用程序是一个用户. 2.默认情况下,系统会为每个app分配唯一的linux用户id(这个id只会被系统使用,并且只会被这个app知道),系统为每个app的所有文件都设置了权限,只有被分配了这个app用户ID的程序可以访问它.

Android 性能核心揭密

- - CSDN博客推荐文章
其实我发现不少人不注重性能的开发,这样产品体验会很差的. 移动互联网是用户体验为王的时代,而排在影响用户体验的问题如快速、流畅、省电等,都与研发优化直接相关. 推荐使用traceview和monkey等工具来测试应用,利用layoutopt和ninepatch等工具优化视图,建议开发者注重代码复用,做好应用分析最大化利用第三方工具.