Android内存限制

java虚拟机有内存使用上限的限制

adb shell进入手机,这此參数被纪录在/system/build.prop中,假设想直接查看能够使用adb shell getprop

单个应用程序最大内存限制,超过这个值会产生OOM

  1. dalvik.vm.heapgrowthlimit

应用启动后分配的初始内存

  1. dalvik.vm.heapstartsize

单个java虚拟机最大的内存限制,超过这个值会产生OOM

  1. dalvik.vm.heapsize

小米2S的一些内存限制

  1. #查看单个应用程序最大内存限制
  2. bixiaopeng@bixiaopengtekiMacBook-Pro ~$ adb shell getprop|grep heapgrowthlimit
  3. |[dalvik.vm.heapgrowthlimit]: [96m]
  4. #应用启动后分配的初始内存
  5. bixiaopeng@bixiaopengtekiMacBook-Pro ~$ adb shell getprop|grep dalvik.vm.heapstartsize
  6. |[dalvik.vm.heapstartsize]: [8m]
  7. #单个java虚拟机最大的内存限制
  8. bixiaopeng@bixiaopengtekiMacBook-Pro ~$ adb shell getprop|grep dalvik.vm.heapsize
  9. |[dalvik.vm.heapsize]: [384m]

Android内存使用

android程序内存一般限制在16M,当然也有24M的,而android程序内存被分为2部分:

native和dalvik,dalvik就是我们寻常说的java堆,我们创建的对象是在这里面分配的,而bitmap是直接在native上分配的,对于内存的限制是 native+dalvik 不能超过最大限制。

用下面命令能够查看程序的内存使用情况:

  1. adb shell dumpsys meminfo $package_name or $pid //使用程序的包名或者进程id

查看虾米音乐app的内存占用情况

  1. bixiaopeng@bixiaopengtekiMacBook-Pro ~$ adb shell dumpsys meminfo fm.xiami.main
  2. Applications Memory Usage (kB):
  3. Uptime: 71696500 Realtime: 98283758
  4. ** MEMINFO in pid 17340 [fm.xiami.main] **
  5. Shared Private Heap Heap Heap
  6. Pss Dirty Dirty Size Alloc Free
  7. ------ ------ ------ ------ ------ ------
  8. Native 0 0 0 1976 1577 226
  9. Dalvik 2973 13956 2712 18691 10825 7866
  10. Cursor 0 0 0
  11. Ashmem 0 0 0
  12. Other dev 4 44 0
  13. .so mmap 894 2320 604
  14. .jar mmap 0 0 0
  15. .apk mmap 123 0 0
  16. .ttf mmap 0 0 0
  17. .dex mmap 2716 0 16
  18. Other mmap 204 120 96
  19. Unknown 808 540 804
  20. TOTAL 7722 16980 4232 20667 12402 8092
  21. Objects
  22. Views: 0 ViewRootImpl: 0
  23. AppContexts: 5 Activities: 0
  24. Assets: 3 AssetManagers: 3
  25. Local Binders: 5 Proxy Binders: 13
  26. Death Recipients: 0
  27. OpenSSL Sockets: 0
  28. SQL
  29. MEMORY_USED: 0
  30. PAGECACHE_OVERFLOW: 0 MALLOC_SIZE: 0

当中size是须要的内存,而allocated是分配了的内存,相应的2列各自是native和dalvik,当总数也就是total这一列超过单个程序内存的最大限制时,OOM就非常有可能会出现了。

  1. Shared Private Heap Heap Heap
  2. Pss Dirty Dirty Size Alloc Free
  3. ------ ------ ------ ------ ------ ------
  4. Native 0 0 0 1976 1577 226
  5. Dalvik 2973 13956 2712 18691 10825 7866
  6. TOTAL 7722 16980 4232 20667 12402 8092

Cpu使用情况

top命令例如以下:

  1. adb shell
  2. $ top -h
  3. top -h
  4. Usage: top [-m max_procs] [-n iterations] [-d delay] [-s sort_column] [-t] [-h]
  5. -m num Maximum number of processes to display. // 最多显示多少个进程
  6. -n num Updates to show before exiting. // 刷新次数
  7. -d num Seconds to wait between updates. // 刷新间隔时间(默认5秒)
  8. -s col Column to sort by <cpu,vss,rss,thr> // 按哪列排序
  9. -t Show threads instead of processes. // 显示线程信息而不是进程
  10. -h Display this help screen. // 显示帮助文档
  11. $ top -n 1
  12. top -n 1

举个样例:

查看前5个进程cup的使用情况

bixiaopeng@bixiaopengtekiMacBook-Pro ~$ adb shell top -m 5 -s cpu

  1. User 33%, System 8%, IOW 0%, IRQ 0%
  2. User 340 + Nice 2 + Sys 83 + Idle 596 + IOW 6 + IRQ 0 + SIRQ 2 = 1029
  3. PID PR CPU% S #THR VSS RSS PCY UID Name
  4. 27256 1 12% S 37 852340K 220296K fg u0_a25 fm.xiami.main
  5. 517 0 6% S 100 842940K 118832K fg system system_server
  6. 174 0 4% S 13 66532K 14000K fg media /system/bin/mediaserver
  7. 27767 0 2% S 11 673928K 50516K bg u0_a58 com.moji.mjweather
  8. 171 0 1% S 13 97904K 51964K fg system /system/bin/surfaceflinger

日志说明:

  1. User 35%, System 13%, IOW 0%, IRQ 0% // CPU占用率
  2. User 109 + Nice 0 + Sys 40 + Idle 156 + IOW 0 + IRQ 0 + SIRQ 1 = 306 // CPU使用情况
  3. PID CPU% S #THR VSS RSS PCY UID Name // 进程属性
  4. xx xx% x xx xx xx xx xx xx
  5. CPU占用率:
  6. User 用户进程
  7. System 系统进程
  8. IOW IO等待时间
  9. IRQ 硬中断时间
  10. CPU使用情况(指一个最小时间片内所占时间,单位jiffies。或者指所占进程数):
  11. User 处于用户态的执行时间,不包括优先值为负进程
  12. Nice 优先值为负的进程所占用的CPU时间
  13. Sys 处于核心态的执行时间
  14. Idle IO等待时间以外的其他等待时间
  15. IOW IO等待时间
  16. IRQ 硬中断时间
  17. SIRQ 软中断时间
  18. 进程属性:
  19. PID 进程在系统中的ID
  20. CPU% 当前瞬时所以使用CPU占用率
  21. S 进程的状态,当中S表示休眠,R表示正在执行,Z表示僵死状态,N表示该进程优先值是负数。
  22. #THR 程序当前所用的线程数
  23. VSS Virtual Set Size 虚拟耗用内存(包括共享库占用的内存)
  24. RSS Resident Set Size 实际使用物理内存(包括共享库占用的内存)
  25. PCY OOXX,不知道什么东东
  26. UID 执行当前进程的用户id
  27. Name 程序名称android.process.media
  28. // ps:内存占用大小有例如以下规律:VSS >= RSS >= PSS >= USS
  29. // PSS Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
  30. // USS Unique Set Size 进程独自占用的物理内存(不包括共享库占用的内存)

温馨提示:

我们一般观察Uss来反映一个Process的内存使用情况,Uss 的大小代表了仅仅属于本进程正在使用的内存大小,这些内存在此Process被杀掉之后,会被完整的回收掉,

Vss和Rss对查看某一Process自身内存状况没有什么价值,由于他们包括了共享库的内存使用,而往往共享库的资源占用比重是非常大的,这样就稀释了对Process自身创建内存波动。 而Pss是依照比例将共享内存切割,某一Process对共享内存的占用情况。

so

查看USS和PSS能够使用adb shell procrank,前提是手机须要root

  1. bixiaopeng@bixiaopengtekiMacBook-Pro ~$ adb shell procrank |grep xiami

假设仅仅是查看PSS也能够使用adb shell dumpsys meminfo

  1. bixiaopeng@bixiaopengtekiMacBook-Pro ~$ adb shell dumpsys meminfo fm.xiami.main|grep TOTAL
  2. TOTAL 143070 15312 130020 135179 122279 12667

温馨提示:

在取内存数据前能够前推断一下手机是否root, 假设root了取USS比較好一些,假设没有root取PSS也是能够的。

微信公众帐号: wirelessqa

关于作者:

作者: 毕小朋 | 老 毕 邮箱: wirelessqa.me@gmail.com

微博: @WirelessQA 博客: http://blog.csdn.net/wirelessqa

Android应用性能測试的更多相关文章

  1. Android App性能測试

    一.内存 1.查看单个应用App最大内存限制 Command:adb shell "getprop|grep heapgrowthlimit" C:\Users\hujiachun ...

  2. Android性能測试 一些适用于Android Studio的代码审查和性能測试工具

    导言: Android应用在CPU占用,内存消耗方面的性能指标是影响产品质量的重要因素,因为QQ管家,360手机助手等应用都提供直观的内存消耗,流量监控功能,致使用户比以往更加关注软件的性能,并以此进 ...

  3. mongodb3.0 性能測试报告 一

    mongodb3.0 性能測试报告 一 mongodb3.0 性能測试报告 二 mongodb3.0 性能測试报告 三 測试环境: 服务器:X86 pcserver   共6台 cpu:  单颗8核 ...

  4. Window平台搭建Redis分布式缓存集群 (一)server搭建及性能測试

    百度定义:Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对很多其它.包含string(字符串).list(链表).set(集合).zset(sort ...

  5. mysql主键设置成auto_increment时,进行并发性能測试出现主键反复Duplicate entry &#39;xxx&#39; for key &#39;PRIMARY&#39;

    mysql主键设置成auto_increment时,进行并发性能測试出现主键反复Duplicate entry 'xxx' for key 'PRIMARY' 解决方法: 在my.cnf的[mysql ...

  6. 系统吞吐量、TPS(QPS)、用户并发量、性能測试概念和公式

    PS:以下是性能測试的主要概念和计算公式,记录下: 一.系统吞度量要素: 一个系统的吞度量(承压能力)与request对CPU的消耗.外部接口.IO等等紧密关联.单个reqeust 对CPU消耗越高, ...

  7. Linux 性能測试工具

    Linux 性能測试工具 linux performance 查看系统配置 查看CPU信息 lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64- ...

  8. android手机安全性測试手段

    android手机安全性測试手段 罗列一下自己经常使用的android手机安全性測试攻击手段: 1. fiddler和tcpdump+wireshark抓包分析,模拟改动http请求參数,检验漏洞 2 ...

  9. LR杂记 - 性能測试指标及经常使用的监控工具

    监控指标 性能測试通常须要监控的指标包含: 1.serverLinux(包含CPU.Memory.Load.I/O). 2.数据库:1.Mysql 2.Oracle(缓存命中.索引.单条SQL性能.数 ...

随机推荐

  1. [Windows Phone]模仿魔兽3技能按钮SkillButton

    简介: 模仿魔兽3技能按钮,带CD效果.使用的时候可以当做普通按钮使用,同时也支持Binding. 音效紧耦合在控件内部,因为控件本身目的就是模拟魔兽3的技能按钮,所以不考虑音效的扩展. Demo结构 ...

  2. Ubuntu下实现双屏独立切换

    在编码时,总觉得屏幕大小不够,要是能多个屏多好,可以这样 把你的显示器连接到你的电脑,然后开启一个终端 输入:xrandr 显示如下: LVDS1 connected 1366x768+1024+0 ...

  3. MinGW MinGW-w64 TDM-GCC等工具链之间的差别与联系

    不当之处,尽请指正. 同样点: 一. 他们都是用于编译生成Windows应用程序的工具链. 二. 他们都是基于gcc的. 不同之处(仅仅说大的): 一.项目之间的关系 1. MinGW应该是最先诞生的 ...

  4. python 学习笔记 10 -- 正則表達式

    零.引言 在<Dive into Python>(深入python)中,第七章介绍正則表達式,开篇非常好的引出了正則表達式,以下借用一下:我们都知道python中字符串也有比較简单的方法, ...

  5. GC日志分析

    JVM的GC日志的主要參数包含例如以下几个: -XX:+PrintGC 输出GC日志 -XX:+PrintGCDetails 输出GC的具体日志 -XX:+PrintGCTimeStamps 输出GC ...

  6. 在word 中复选框划勾或叉的方法

    输入大写字母R.大写字母Q ,然后将字体改为Wingdings 2, 就分离得到带框的勾和叉.

  7. 谈谈android反编译和防止反编译的方法(转)

    谈谈android反编译和防止反编译的方法(转) android基于java的,而java反编译工具很强悍,所以对正常apk应用程序基本上可以做到100%反编译还原. 因此开发人员如果不准备开源自己的 ...

  8. tomcat dbcp 基于jndi当配置java.sql.SQLException: Already closed

    最近发现了一个现象,观察到的生产环境,不要有一段时间操作,然后另一个操作,首先将有一个数据库连接:java.sql.SQLException: Already closed.,例如下列: error ...

  9. 命令行參数选项处理:getopt()及getopt_long()函数使用

         在执行某个程序的时候,我们通常使用命令行參数来进行配置其行为.命令行选项和參数控制 UNIX 程序,告知它们怎样动作. 当 gcc的程序启动代码调用我们的入口函数 main(int argc ...

  10. Android中的动画具体解释系列【1】——逐帧动画

    逐帧动画事实上非常easy,以下我们来看一个样例: <?xml version="1.0" encoding="utf-8"?> <anima ...