安卓软件开发介绍手机什么视频播放软件好用,占内存少

用软件来实测 安卓手机1G内存够用么?
  智能手机现在已经比较的普及了,它就像一个迷你的电脑,麻雀虽小五脏俱全,,CPU的核心数与频率在不断的增长,内存也不断的增多,如果说以前1G运行内存已经是顶级配置的话,现在2G内存都成了标配。那么,内存到底1G够不够用呢?图1 1G内存够不够  &iPhone 6用户都不在意1G内存不够,红米2的1G内存够用了,保持流畅的秘诀就是少装App。&这个言论又引起了大家对1G运行内存的激烈讨论。本文就来与大家一起探讨一下安卓手机1G够不够用。首先我们得分清内存到底指的是?  什么是内存?有许多人将手机的两种内存搞混淆,就像许多人分不清电脑里的内存与硬盘一样,那么,来看看下边的解释。  广义的手机系统内存分为&手机运行内存&及&手机非运行内存&。  手机的&运行内存&相当于电脑的内存(或者叫内存条),主要用于临时数据交换用,用来暂存正在运行的程序,加快程序运行速度,存储速度较快,但断电后数据丢失,手机&运行内存&越大,手机能运行多个程序且流畅。  手机的&非运行内存&,即手机的ROM和外置存储器(存储卡)相当于电脑的硬盘。手机&非运行内存&越大,就像硬盘越大,能存放更多的数据。存储速度较慢,但断电后数据保留。  本文讨论的是安卓手机的1G&手机运行内存&。图2&安卓手机1G内存够用么?请出老前辈来试试  接下来,笔者请出一个手机界的老前辈,虽然它们的配置在现在看来已经落后不少,但是在一定程度上能反映1G内存到底够不够用还是得省着点用,看看它廉颇老矣,尚能饭否?  下边请出的是小米1s青春版,来看看它的配置参数。这样的配置相信与现在的流行手机对比起来已经落伍了不少了。当然,1G运行内存的安卓手机还有大把,之所以请出它来那是因为笔者手上只有这款手机运行内存是1G的。  CPU型号:高通MSM8260 双核1.5G  屏幕尺寸:4.0英寸  运行内存:1GB RAM  屏幕分辨率:480&854(FWVGA)像素  机身容量:4GB  操作系统:MIUI系统支持Android4.0  后置相机:800万像素  前置相机:200万像素1G内存够用么?测试前的准备工作  笔者先将小米1s青春版进入Recovery模式后进行三清操作,然后在刷入官网最新Miui 4.12.5 (V5) (开发版),接着再进行下边的测试。图3 三清后升级系统到最新版本1G内存够用么?常用软件来试试开机内存剩多少?  纯净系统(其实也不算纯净,毕竟Miui也附带了一些自身的应用),开机后剩余内存有多少呢?图4 纯净系统开机剩余内存  从上图可以看到,依据miui自身的内存清理应用中的剩余内存信息可以看到,纯净的系统可用内存为380M左右,数值在+-10左右变化。常用应用你装不装  虽然说,低配置的安卓手机想要流畅,就别装那么多的应用,但是一些常用的应用还是必须要装的,什么?你啥都不装,就拿来打电话和发短信,那你买智能手机干嘛?有钱任性?再说了,现在不少手机里一买到就已经安装了一堆应用在那里,这些应用可不管你有没有使用,只要你手机开机了,就自动启动,默认入驻后台。先来两个必备应用  说起智能手机里必装的应用,那么当属各种的即时通讯类应用了,用于朋友间联络的手机QQ、三姑六婆都在用的微信、交友用的陌陌、还有就是最近开始流行的免费电话类应用。光是这些就有10多种应用可供选择,咱在这里只安装手机QQ与微信。  笔者进入Miui的应用商店,进行手机QQ的安装操作,安装后对系统进行重启,然后在运行QQ,使QQ处于在线状态,接着再查看剩余内存。图5 开启QQ后剩余内存  从上图可以看到,运行QQ后,系统剩余内存为340M左右,数值在+-20左右变化。  然后就是安装微信,安装后对系统进行重启,然后在运行QQ与微信,使两者处于在线状态,接着查看剩余内存。图6 开启QQ和微信后剩余内存  从上图可以看到,同时运行手机QQ与微信后,系统剩余内存为295M左右,数值在+-20左右变化。想要输入快好输入法少不了  在手机中进行输入,少不了一款好用的输入法,那么咱就请出QQ输入法来进行测试吧。  然后就是安装QQ输入法,安装后对系统进行重启,然后在运行QQ、微信、QQ输入法,使测试应用皆处于运行状态,接着查看剩余内存,以下同,就不重复叙述了。加入QQ输入法后剩余内存270M。图7 加入QQ输入法手机购物真方便  手机购物怎可少,手机淘宝加入战团。加入手机淘宝后剩余内存232M。图8 加入手机淘宝后音乐怎能少的了  背景音乐响起来,加入酷我音乐。加入酷我音乐后剩余内存178M。图9 加入酷我音乐视频也要可以看  手机也是小电视,在线视频怎可少,爱奇艺加入战团。虽然没谁会把酷我跟爱奇艺同时进行播放操作,但为了测试,咱姑且让它们拼拼嗓门吧。加入爱奇艺剩余内存120M。图10 加入爱奇艺播放还能玩游戏不  那么在剩余内存仅有100多M的情况下,还能不能玩游戏呢?咱就请出两款比较中规中矩的游戏《植物大战僵尸2》及《顽皮鳄鱼爱洗澡》来测试一下还能不能正常的畅玩,酷我和爱奇艺处于后台运行状态,但没有播放操作。图11 植物大战僵尸2图12 植物大战僵尸2  嗯,玩这些普通游戏还是可以的,只是玩植物大战僵尸,一大波僵尸涌入时会有稍卡现象。至于大型游戏就不列入这里的测试了,大型游戏当然要求内存越多越好,但是对于其它硬件如CPU、GPU的要求也就更高,不在本文讨论范围。常用应用来报告  至此,大家可以如果上边提到的常用应用全部同时运行的话,这个时候剩余的内存已经不多了,只剩下100多M的内存了,不过这些常用应用的运行状况良好,爱奇艺播放视频也较为流畅。看来,1G内存应付常用的一些应用还是没有问题的。当然,还有像微博、导航、记账、记事、阅读类的一些常用应用没有加入测试,但是鲜有用户把它们一起打开的吧。  咱再来看看安装了以上应用后,开机时剩余的内存有多少。开机剩余内存312M左右。图13 开机剩余内存1G内存够用么?探讨小结  从上边可以看到,每运行一个应用,都要消耗一定的内存,而且,消耗的内存不一定是固定的,可能会随着应用的运行而进行增长。在运行以上应用的情况下,1G内存还是可以胜任的。。对于普通用户来说,上上网,聊聊天,没有大型游戏的需求,1G内存还是可以满足的。但是如果你的急性子,比如1分钟内频繁的切换多个应用的话,也可能会导致卡机的出现。对于游戏爱好者来说,2G内存才是标配。对于手机里安装了N多应用而又任由它们胡作非为的用户,2G内存也是不够用的。
键盘也能翻页,试试“← →”键
最新资讯离线随时看
聊天吐槽赢奖品
相关软件:
大小:1.93 MB
授权:免费
大小:62.51 MB
授权:免费为什么安卓手机的运存越来越大?都是被国产软件逼的!
为什么安卓手机的运存越来越大?都是被国产软件逼的!
刚刚发布的三星Note 7配备了5.7英寸的2K分辨率曲面平板,还加上了防水的SPen、虹膜识别等特色功能,称其为年度安卓机皇也不为过。然而最初三星公布的Note 7只有4GB的版本,让国内不少用户都大呼失望。好在三星随后又公布了一款6GB RAM + 128GB ROM内存组合的Note 7,这才让国内用户放下心来。有媒体调查表明,打算购买三星Note 7的用户中有超过50%的人希望购买6GB运存的版本,哪怕这一版本的售价超过6000元。
今年2000元以上价位的中高端安卓手机已经普遍配备了4GB的运存(RAM),而类似乐视乐Max2、ZUK Z2 Pro、一加3、nubia Z11尊享版这样的旗舰手机甚至配备了6GB的运存。更有消息称,下半年还将有一批搭载高通骁龙821,支持8GB运存的手机上市。要知道3GB运存的安卓智能手机在去年刚刚普及,不到一年的时间里,运存容量就翻了一番达到6GB,而且还有快速上升的趋势,这是为什么呢?
出现这种情况主要还是和安卓系统的运行机制有关。安卓系统为了保证每一款应用软件能够快速启动,在应用软件第一次开启后就会将其保留在后台,并处于可以随时调用的状态,直到后台运行任务达到一定数量之后才会逐步关闭一些长时间没有开启的应用。这样一来安卓手机后台运行的应用越多,所需要的运存(RAM)也就越大。为了保证手机可以同时运行更多的应用,运存的容量自然也就越大越好。
另外,由于国内的安卓系统都没有谷歌框架,无法通过谷歌建立的标准服务接口推送新消息。所以类似微信、QQ这类通信类的应用软件想要在第一时间收到新消息,也必须时刻在后台保持活动状态。而用户不刻意设置的话,类似微博、旺旺、钉钉等社交应用软件都会驻留在系统运存当中,如果没有足够的运存,用户就会感觉到自己的手机越用越卡顿。
如果你的手机里有“手机管家”之类的软件,就可以看到QQ、微信等社交通信类软件会长期驻留系统后台,并且会定时唤醒系统。但是你又不能将其彻底关闭,因为这样一来你就收不到好友发送的QQ或者微信消息了。所以为了保证这些社交软件的正常使用,运行内存肯定是越大越好。
还有一些国产手机的操作系统因为功能越来越多,也开始变得更加臃肿,因此需要更大的运行内存来保证系统基本功能的正常运行。
比如小米的MIUI8就加入了诸如“手机分身”、“相册人脸识别”等新功能,尽管这些新功能很酷,但系统所需要的运行内存空间也进一步提升。很多用户的小米5在开机之后就只剩下1GB左右的可用运行内存,如果在开个QQ、微信就只剩下几百MB了。可见3GB的运行内存对于现在的国产系统和应用软件来说已经完全不够用。
更可怕的是,一些国产手机应用软件还会关联启动,比如同时装了淘宝客户端和手机支付宝这两个应用的用户应该都有这样的体验:在开启手机支付宝之后,有很大机率同时会收到来自淘宝客户端的消息,这意味着淘宝客户端已经被手机支付宝关联启动了,哪怕用户此时根本不想打开淘宝!
除了关联启动之外,一些手机应用软件还喜欢自启动来刷“存在感”,这也是耗费运行内存的一大元凶。好在类似华为EMUI之类的国产操作系统一般都具备自启动拦截的功能,从上面图右可以看到,“爱奇艺”客户端半天之内就自启动了409次,几乎每三分钟就会自启动一次。而令人更无语的是,华为EMUI自带的“天际通”居然也自启动了117次,这款应用主要针对出国旅游的用户,实在想不通它有什么自启动的必要。
正是因为各种国产手机应用软件毫无节操的频繁“关联启动”、“自启动”,导致国产安卓手机的运行内存经常捉襟见肘,很容易就不够用了。所以在迫不得已之下,安卓手机的运存也就越来越大,国内用户也更倾向于购买大运存的手机。
目前来说,4GB的运存内存基本上就可以保证安卓手机的流畅使用。但是一些国产手机为了保证一些关键功能可以快速启动,将一部分运行内存指定给这些关键功能使用。比如一加3虽然配备了6GB的运行内存,但是有一部分运存是固定划分给相机程序使用的,为的就是在任何情况下都可以快速启动相机。这虽然损失了一部分运行内存,对于经常使用一加3拍照的用户来说,无疑是一个很好的使用体验。4668人阅读
【Android学习】(35)
我 们知道,android程序内存一般限制在16M,当然也有24M的,而android程序内存被分为2部分:native和dalvik,dalvik 就是我们平常说的java堆,我们创建的对象是在这里面分配的,而bitmap是直接在native上分配的,对于内存的限制是&native+dalvik&不能超过最大限制。
1.单个app 内存限制大小
ActivityManager&activityManager&=&(ActivityManager)&context.getSystemService(Context.ACTIVITY_SERVICE);&&&&&&&&&&activityManager.getMemoryClass();&&
2.&/proc/meminfo& &系统内存信息文件【整个系统的内存情况】
3.ActivityManager.MemoryInfo【整个系统】
availMem & & & & 剩余内存
threshold & & & & 临界值 【超过次值就开始杀死后台服务和没有关联的进程】
lowMemory & & 低内存状态
4.android.os.Debug
getNativeHeapFreeSize()
getNativeHeapAllocatedSize()
getNativeHeapSize()
5.android.os.Debug.MemoryInfo【当前进程的内存情况】
totalMemory()
freeMemory()
maxMemory()
7.VMRuntime
getTargetHeapUtilization()
getMinimumHeapSize()
getExternalBytesAllocated() &&应该是外部分配的内存Native内存
系统GC释放的内存提示
一般在LOG里面显示如下:
09-28 17:16:37.543: DEBUG/dalvikvm(21466): GC_EXTERNAL_ALLOC freed 390 objects /
45656 bytes in 50ms
09-28 17:16:40.513: DEBUG/dalvikvm(3267): GC_EXPLICIT freed 4501 objects / 251624 bytes in 67ms
:Free的内存是VM中java使用的内存
即 heap mem
:Free的内存是VM中通过JNI的Native类中的malloc分配的内存
例如 Bitmap 和一些 Cursor
在Davilk中,给一个程序分配的内存根据机型厂商的不同,而不同,现在的大部分的是32M了,而在VM内部会把这些内存分成java使用的内存和 Native使用的内存,它们之间是不能共享的,就是说当你的Native内存用完了,现在Java又有空闲的内存,这时Native会重新像VM申请,而不是直接使用java的。
例如上边的例子
explicit K
external 2K
如果这时需要创建一个2M的
Native现有内存=k,因此他就会向Vm申请内存,虽然java空闲的内存是
52&2048,但这部分内存Native是不能使用。
但是你现在去申请2M的Native内存,VM会告诉你无法分配的,因为现在已使用的内存已经接近峰值了32M(23=32923 ),所以现在就会成force close 报OOM。
所以现在我们要检查我们的native内存的使用情况来避免OOM。
三、通过Android系统提供的Runtime类,执行adb 命令(top,procrank,ps...等命令)查询
内存耗用:VSS/RSS/PSS/USS
? VSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
? RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存)
? PSS - Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
? USS - Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)
一般来说内存占用大小有如下规律:VSS &= RSS &= PSS &= USS
查看每个进程及其内存状况
private void getRunningAppProcessInfo() {
mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
// 获得系统里正在运行的所有进程
List&RunningAppProcessInfo& runningAppProcessesList = mActivityManager
.getRunningAppProcesses();
for (RunningAppProcessInfo runningAppProcessInfo : runningAppProcessesList) {
// 进程ID号
int pid = runningAppProcessInfo.
int uid = runningAppProcessInfo.
String processName = runningAppProcessInfo.processN
// 占用的内存
int[] pids = new int[] { pid };
Debug.MemoryInfo[] memoryInfo = mActivityManager
.getProcessMemoryInfo(pids);
int memorySize = memoryInfo[0].dalvikPrivateD
st = st + &processName=& + processName + &,pid=& + pid + &,uid=&
+ uid + &,memorySize=& + memorySize + &kb& + &\n&;
System.out.println(&processName=& + processName + &,pid=& + pid
+ &,uid=& + uid + &,memorySize=& + memorySize + &kb&);
}查看总内存:
public long getmem_TOLAL() {
// /proc/meminfo读出的内核信息进行解释
String path = &/proc/meminfo&;
String content =
BufferedReader br =
br = new BufferedReader(new FileReader(path), 8);
if ((line = br.readLine()) != null) {
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
br.close();
} catch (IOException e) {
e.printStackTrace();
// beginIndex
int begin = content.indexOf(':');
// endIndex
int end = content.indexOf('k');
// 截取字符串信息
content = content.substring(begin + 1, end).trim();
mTotal = Integer.parseInt(content);
查看内存信息(该api较新):
public long getmem_UNUSED(Context mContext) {
long MEM_UNUSED;
// 得到ActivityManager
ActivityManager am = (ActivityManager) mContext
.getSystemService(Context.ACTIVITY_SERVICE);
// 创建ActivityManager.MemoryInfo对象
ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo();
am.getMemoryInfo(mi);
textView3.setText(&totalMen:& + mi.totalMem / 1024 + &\n&
+ &threshold:& + mi.threshold / 1024 + &\n& + &availMem:&
+ mi.availMem / 1024 + &\n&);
// 取得剩余的内存空间
MEM_UNUSED = mi.availMem / 1024;
return MEM_UNUSED;
查看app内存:
ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
int i=manager.getMemoryClass();
textView.setText(&\n&+&app:&+i);
像Linux这种现代操作系统的内存使用是很复杂的,因此很难准确的知道你的应用程序使用了好多内存。
查看内存使用的方式有很多种,但是各个方式查看到的结果可能会有微略不同。
方式一,Running
通过手机上Running services的Activity查看,可以通过Setting-&Applications-&Running services进。
关于Running services的详细内容请参考《》
方式二,使用ActivityManager的(&outInfo)
ActivityManager.getMemoryInfo()主要是用于得到当前系统剩余内存的及判断是否处于低内存运行。
&&&&private void displayBriefMemory() { &&&
&&&&&&&&final ActivityManager activityManager = (ActivityManager)
getSystemService(ACTIVITY_SERVICE); &&&
&&&&&&&&ActivityManager.MemoryInfo info = new ActivityManager.MemoryInfo(); &&
&&&&&&&&activityManager.getMemoryInfo(info); &&&
&&&&&&&&Log.i(tag,&系统剩余内存:&+(info.availMem&&&
10)+&k&); &&
&&&&&&&&Log.i(tag,&系统是否处于低内存运行:&+info.lowMemory);
&&&&&&&&Log.i(tag,&当系统剩余内存低于&+info.threshold+&时就看成低内存运行&);
ActivityManager.getMemoryInfo()是用ActivityManager.MemoryInfo返回结果,而不是Debug.MemoryInfo,他们不一样的。
ActivityManager.MemoryInfo只有三个Field:
availMem:表示系统剩余内存
lowMemory:它是boolean值,表示系统是否处于低内存运行
hreshold:它表示当系统剩余内存低于好多时就看成低内存运行
方式三,在代码中使用Debug的getMemoryInfo(Debug.MemoryInfo
memoryInfo)或ActivityManager的MemoryInfo[] getProcessMemoryInfo(int[]
该方式得到的MemoryInfo所描述的内存使用情况比较详细.数据的单位是KB.
MemoryInfo的Field如下
dalvikPrivateDirty:&The
private dirty pages used by dalvik。
dalvikPss&:The proportional
set size for dalvik.
dalvikSharedDirty&:The
shared dirty pages used by dalvik.
nativePrivateDirty&:The private dirty
pages used by the&native heap.
nativePss&:The proportional set size for
the native heap.
nativeSharedDirty&:The
shared dirty pages used by the&native heap.
otherPrivateDirty&:The private dirty pages
used by everything else.
otherPss&:The proportional
set size for everything else.
otherSharedDirty&:The
shared dirty pages used by everything else.
Android和Linux一样有大量内存在进程之间进程共享。某个进程准确的使用好多内存实际上是很难统计的。
因为有paging out to disk(换页),所以如果你把所有映射到进程的内存相加,它可能大于你的内存的实际物理大小。
dalvik:是指dalvik所使用的内存。
native:是被native堆使用的内存。应该指使用C\C++在堆上分配的内存。
other:是指除dalvik和native使用的内存。但是具体是指什么呢?至少包括在C\C++分配的非堆内存,比如分配在栈上的内存。puzlle!
private:是指私有的。非共享的。
share:是指共享的内存。
PSS:实际使用的物理内存(比例分配共享库占用的内存)
Pss:它是把共享内存根据一定比例分摊到共享它的各个进程来计算所得到进程使用内存。网上又说是比例分配共享库占用的内存,那么至于这里的共享是否只是库的共享,还是不清楚。
&PrivateDirty:它是指非共享的,又不能换页出去(can
not be paged to disk&)的内存的大小。比如Linux为了提高分配内存速度而缓冲的小对象,即使你的进程结束,该内存也不会释放掉,它只是又重新回到缓冲中而已。
SharedDirty:参照PrivateDirty我认为它应该是指共享的,又不能换页出去(can
not be paged to disk&)的内存的大小。比如Linux为了提高分配内存速度而缓冲的小对象,即使所有共享它的进程结束,该内存也不会释放掉,它只是又重新回到缓冲中而已。
具体代码请参考实例1
注意1:MemoryInfo所描述的内存使用情况都可以通过命令adb
shell&&dumpsys meminfo %curProcessName%&&得到。
注意2:如果想在代码中同时得到多个进程的内存使用或非本进程的内存使用情况请使用ActivityManager的MemoryInfo[]
getProcessMemoryInfo(int[] pids),
否则Debug的getMemoryInfo(Debug.MemoryInfo
memoryInfo)就可以了。
注意3:可以通过ActivityManager的&&a
href=&/reference/android/app/ActivityManager.RunningAppProcessInfo.html& rel=&nofollow& style=&color: rgb(207, 121, 28); text-decoration:&&ActivityManager.RunningAppProcessInfo&&()得到当前所有运行的进程信息。
中就有进程的id,名字以及该进程包括的所有apk包名列表等。
注意4:数据的单位是KB.
方式4、使用Debug的getNativeHeapSize
(),getNativeHeapAllocatedSize (),getNativeHeapFreeSize ()方法。
该方式只能得到Native堆的内存大概情况,数据单位为字节。
Returns the amount
of allocated memory in the native heap.
返回的是当前进程navtive堆中已使用的内存大小
static long&()
Returns the amount of free memory in the native heap.
返回的是当前进程navtive堆中已经剩余的内存大小
static long&()
Returns the size of the native heap.
返回的是当前进程navtive堆本身总的内存大小
示例代码:
&&&&&&&&&&Log.i(tag,&NativeHeapSizeTotal:&+(Debug.getNativeHeapSize()&&10));
&&&&&&&&&&Log.i(tag,&NativeAllocatedHeapSize:&+(Debug.getNativeHeapAllocatedSize()&&10));
&&&&&&&&&&Log.i(tag,&NativeAllocatedFree:&+(Debug.getNativeHeapFreeSize()&&10));
注意:DEBUG中居然没有与上面相对应的关于dalvik的函数。
方式五、使用dumpsys
meminfo命令。
我们可以在adb shell 中运行dumpsys
meminfo命令来得到进程的内存信息。在该命令的后面要加上进程的名字,以确定是哪个进程。
shell dumpsys meminfo&com.teleca.robin.test&&将得到com.teleca.robin.test进程使用的内存的信息:&
Applications Memory Usage (kB):
** MEMINFO in pid 3407 [com.teleca.robin.test] **
&&&&&&&&&&&&&&&&&&&&native &&dalvik &&&other &&&total
&&&&&&&&&&&&size:
&&&&3456 &&&&3139 &&&&&N/A &&&&6595
&&&&&&&allocated:
&&&&3432 &&&&2823 &&&&&N/A &&&&6255
&&&&&&&&&&&&free:
&&&&&&23 &&&&&316 &&&&&N/A &&&&&339
&&&&&&&&&&&(Pss):
&&&&&724 &&&&1101 &&&&1070 &&&&2895
&&(shared dirty):
&&&&1584 &&&&4540 &&&&1668 &&&&7792
&&&&(priv dirty):
&&&&&644 &&&&&608 &&&&&688 &&&&1940
&&&&&&&&&&&Views: &&&&&&&0 &&&&&&&ViewRoots: &&&&&&&0
&&&&&AppContexts: &&&&&&&0 &&&&&&Activities: &&&&&&&0
&&&&&&&&&&Assets: &&&&&&&3 &&&AssetManagers: &&&&&&&3
&&&Local Binders: &&&&&&&5 &&&Proxy Binders: &&&&&&11
Death Recipients: &&&&&&&0
&OpenSSL Sockets: &&&&&&&0
&&&&&&&&&&&&heap: &&&&&&&0 &&&&&&memoryUsed: &&&&&&&0
pageCacheOverflo: &&&&&&&0 &largestMemAlloc: &&&&&&&0
&Asset Allocations
&&&&zip:/data/app/com.teleca.robin.test-1.apk:/resources.arsc: 1K
&&size& 表示的是总内存大小(kb)。, &allocated& 表示的是已使用了的内存大小(kb),, &free&表示的是剩余的内存大小(kb), 更多的可以参照方式三和方式四中的描述
现在已经有了自动提取汇总dumpsys
meminfo信息的工具,具体请参照《》及其系列文章。
方式六、使用&&adb
shell procrank&命令
如果你想查看所有进程的内存使用情况,可以使用&adb
shell procrank&命令。命令返回将如下:
&&PID &&&&&Vss &&&&&Rss &&&&&Pss &&&&&Uss &cmdline
&&188 &&75832K &&51628K &&24824K &&19028K &system_server
&&308 &&50676K &&26476K &&&9839K &&&6844K &system_server
&2834 &&35896K &&31892K &&&9201K &&&6740K &com.sec.android.app.twlauncher
&&265 &&28536K &&28532K &&&7985K &&&5824K &com.android.phone
&&100 &&29052K &&29048K &&&7299K &&&4984K &zygote
&&258 &&27128K &&27124K &&&7067K &&&5248K &com.swype.android.inputmethod
&&270 &&25820K &&25816K &&&6752K &&&5420K &com.android.kineto
&1253 &&27004K &&27000K &&&6489K &&&4880K &com.google.android.voicesearch
&2898 &&26620K &&26616K &&&6204K &&&3408K &com.google.android.apps.maps:FriendService
&&297 &&26180K &&26176K &&&5886K &&&4548K &com.google.process.gapps
&3157 &&24140K &&24136K &&&5191K &&&4272K &android.process.acore
&2854 &&23304K &&23300K &&&4067K &&&2788K &com.android.vending
&3604 &&22844K &&22840K &&&4036K &&&3060K &com.wssyncmldm
&&592 &&23372K &&23368K &&&3987K &&&2812K &com.google.android.googlequicksearchbox
&3000 &&22768K &&22764K &&&3844K &&&2724K &com.tmobile.selfhelp
&&101 &&&8128K &&&8124K &&&3649K &&&2996K &/system/bin/mediaserver
&3473 &&21792K &&21784K &&&3103K &&&2164K &com.android.providers.calendar
&3407 &&22092K &&22088K &&&2982K &&&1980K &com.teleca.robin.test
&2840 &&21380K &&21376K &&&2953K &&&1996K &com.sec.android.app.controlpanel
......................................................................................................................
关于VSS,RSS,PSS,USS的意义请参考《》
注意1:这里的PSS和方式四PSS的total并不一致,有细微的差别。为什么呢?这是因为procrank
命令和meminfo命令使用的内核机制不太一样,所以结果会有细微差别
注意2:这里的Uss&和方式四的Priv
Dirtyd的total几乎相等.他们似乎表示的是同一个意义。但是现在得到的关于它们的意义的解释却不太相同。难道这里Private的都是dirty(这里指不能换页)?&Puzzle!
方式七、使用&adb
shell cat /proc/meminfo& 命令。
该方式只能得出系统整个内存的大概使用情况。
MemTotal: &&&&&&&&395144 kB&
MemFree: &&&&&&&&&184936 kB&
Buffers: &&&&&&&&&&&&880 kB&
Cached: &&&&&&&&&&&84104 kB&
SwapCached: &&&&&&&&&&&0 kB&
................................................................................................
MemTotal&:可供系统和用户使用的总内存大小&(它比实际的物理内存要小,因为还有些内存要用于radio,
DMA buffers, 等).&
MemFree:剩余的可用内存大小。这里该值比较大,实际上一般Android
system 的该值通常都很小,因为我们尽量让进程都保持运行,这样会耗掉大量内存。
Cached:&这个是系统用于文件缓冲等的内存.
通常systems需要20MB 以避免。当内存紧张时,the Android out of memory killer将杀死一些background进程,以避免他们消耗过多的cached
RAM ,当然如果下次再用到他们,就需要paging. 那么是说background进程的内存包含在该项中吗?
方式八,使用“adb shell ps -x”命令
该方式主要得到的是内存信息是VSIZE 和RSS。
USER &&&&PID &&PPID &VSIZE &RSS &&&&WCHAN &&&PC
&&&&&&&&NAME
.........................省略.................................
app_70 &&&3407 &100 &&56 ffffffff afd0eb18 S com.teleca.robin.test
(u:55, s:12)
app_7 &&&&3473 &100 &&84 ffffffff afd0eb18 S com.android.providers.calendar (u:16, s:8)
radio &&&&3487 &100 &&40 ffffffff afd0eb18 S com.osp.app.signin (u:11, s:12)
system &&&3511 &100 &&24 ffffffff afd0eb18 S com.android.settings (u:11, s:4)
app_15 &&&3546 &100 &&00 ffffffff afd0eb18 S com.sec.android.providers.drm (u:15, s:6)
app_59 &&&3604 &100 &&56 ffffffff afd0eb18 S com.wssyncmldm (u:231, s:54)
root &&&&&4528 &2 &&&&0 &&&&&0 &&&&c000000 S flush-138:13
(u:0, s:0)
root &&&&&4701 &152 &&676 &&&336 &&c00a68c8 afd0e7cc S /system/bin/sh (u:0,
root &&&&&4702 &4701 &820 &&&340 && afd0d8bc R ps (u:0, s:5)
VSZIE:意义暂时不明。
VSS:请参考《》
注意1:由于RSS的价值不是很大,所以一般不用。
注意2:通过该命令提取RSS,已经有了工具,具体参照《》及其系列。
&&&&int cnt=0;
&&&&final static int kBufferMinSize=1000;
&&&&final static int kBufferMaxSize=2000;
&&&&StringBuffer strBuffer=new StringBuffer(kBufferMinSize);
&&&&StringBuffer strBuffer2=new StringBuffer(kBufferMinSize);
&&&&StringBuffer strBuffer3=new StringBuffer(kBufferMinSize);
&&&&StringBuffer strBufferNativePss=new StringBuffer(kBufferMinSize);
&&&&StringBuffer strBufferDalvikPss=new StringBuffer(kBufferMinSize);
&&&&StringBuffer strBufferOtherPss=new StringBuffer(kBufferMinSize);
&&&&Debug.MemoryInfo memoryInfo=new Debug.MemoryInfo();
&&&&final static String tag=&robin&;
&&&&void printMemory()
&&&&long totalMemory=Runtime.getRuntime().totalMemory();
&&&&&&&&&&long freeMemory=Runtime.getRuntime().freeMemory();
&&&&&&&&&&long usedMemory=(totalMemory-freeMemory)&&10;
&&&&&&&&&&totalMemory=totalMemory&&10;
&&&&&&&&&&freeMemory=freeMemory&&10;
&&&&&&&&&&if(strBuffer.length()&kBufferMaxSize)
&&&&&&&&&&{
&&&&&&&&&&&&&&&&strBuffer.delete(0,strBuffer.length());
&&&&&&&&&&&&&&&&strBuffer2.delete(0,strBuffer2.length());
&&&&&&&&&&&&&&&&strBuffer3.delete(0,strBuffer3.length());
&&&&&&&&&&&&&&&&strBufferNativePss.delete(0,strBufferNativePss.length());
&&&&&&&&&&&&&&&&strBufferDalvikPss.delete(0,strBufferDalvikPss.length());
&&&&&&&&&&}
&&&&&&&&&&strBuffer.append(usedMemory+&,&);
&&&&&&&&&&strBuffer2.append(totalMemory+&,&);
&&&&&&&&&&strBuffer3.append((Debug.getNativeHeapSize()&&10)+&,&);
&&&&&&&&&&Debug.getMemoryInfo(memoryInfo);
&&&&&&&&&&strBufferNativePss.append((memoryInfo.nativePss)+&,&);
&&&&&&&&&&strBufferDalvikPss.append((memoryInfo.dalvikPss)+&,&);
&&&&&&&&&&if(cnt++==0)
&&&&&&&&&&{
&&&&&&&&&&&&&&&&Log.i(tag,&usedMemory:&+strBuffer.toString());
&&&&&&&&&&&&&&&&Log.i(tag,&totalMemory:&+strBuffer2.toString());
&&&&&&&&&&&&&&&&Log.i(tag,&NativeHeapSize:&+strBuffer3.toString());
&&&&&&&&&&&&&&&&Log.i(tag,&Native PSS:&+strBufferNativePss.toString());
&&&&&&&&&&&&&&&&Log.i(tag,&Dalvik PSS:&+strBufferDalvikPss.toString());
&&&&&&&&&&} &&&
注意,对于输出的内存信息日志,我们稍作编辑就可以用于在excel产中图表,比便更直观的进行分析。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:110040次
积分:2013
积分:2013
排名:千里之外
原创:81篇
评论:23条
(1)(1)(1)(3)(6)(4)(1)(1)(3)(1)(2)(1)(4)(5)(1)(2)(3)(4)(9)(2)(4)(4)(7)(7)(3)(1)(1)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'}

我要回帖

更多关于 安卓课程体系 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信