Android进程内存统计工具procstats.docx
《Android进程内存统计工具procstats.docx》由会员分享,可在线阅读,更多相关《Android进程内存统计工具procstats.docx(15页珍藏版)》请在冰豆网上搜索。
Android进程内存统计工具procstats
进程统计:
了解如何使你的应用程序使用RAM
安卓4.4奇巧推出了一款名为procstats新的系统服务,帮助您更好地了解您的应用程序是如何使用设备上的RAM资源。
Procstats能够看到您的应用程序的行为在一段时间-包括它在后台运行,多少内存在这段时间里,它使用多长时间。
它可以帮助你快速找到尤其是在低RAM的设备上运行时效率低下和不良行为在你的应用程序,它可以影响它如何执行。
您可以使用亚行的shell命令来访问procstats的数据,但为了方便也有一个新的进程统计的开发工具,它提供了一个图形化的前端相同的数据。
你可以找到处理统计在设置>开发人员选项>进程统计 。
在这篇文章中,我们将先来看看进程统计图形工具,然后深入到它背后的存储器中的数据,它是如何收集的细节,以及为什么它是如此对你有用,你分析你的应用程序。
存储过程概述统计一段时间内使用的后台进程。
综观全系统的内存使用和后台进程
当您打开进程统计,你看到的全系统内存不足的情况,并了解如何进程使用的内存随着时间的总结。
在右边的图像给你什么,你可能一个典型的设备上看到的一个例子。
在我们可以看到,在屏幕的顶部:
∙我们正在收集过去〜3.5小时数据。
∙目前该设备的RAM情况良好(“设备的内存是目前正常”)。
∙在此期间,整个时间内存状态一直不错-这是显示由绿条。
如果设备内存是越来越低,你会看到代表总时间与低内存量栏左侧的黄色和红色区域。
下面的绿条,我们可以看到在后台,他们已经把系统上的内存负载运行的进程的概述:
∙右边的百分比数字表示每个时间进程已经花费的总持续时间期间运行的量。
∙蓝条表示每个过程的相对计算的内存负载。
(内存负荷runtime*avg_pss ,我们将进入更详细的版本。
)
∙一些应用程序可能会多次列出,因为什么被显示的是进程(例如,谷歌Play业务运行在两个过程)。
这些应用程序的存储器负荷是其各个处理的负荷的总和。
∙有在该已经全部运行的100%的时间前几道工序,但与由于其相对存储器使用不同的权重。
分析内存的具体流程
这个例子显示了一些有趣的数据:
我们有比谷歌键盘更高的内存重量时钟的应用程序,即使它跑了不到一半的时间。
我们可以挖掘到这些过程的细节仅仅通过点击它们:
流程统计内存细节时钟和键盘的过程,在过去3.5小时。
细节对于这两个过程表明:
∙该时钟已在所有运行的原因是因为它是被用作当前的屏幕保护程序时,该设备处于闲置状态。
∙即使时钟过程跑了键盘的不到一半的时间,它的压头使用是显著较大(几乎3倍),这也就是为什么它的总重量较大。
从本质上讲,procstats提供了一个“内存使用”计这很像存储使用或数据使用量规,显示在后台运行的应用程序的多少RAM使用。
不像存储或数据,不过,内存使用是非常难以量化和衡量,并procstats使用一些技巧来这样做。
为了说明测量内存使用的复杂性,考虑相关主题:
任务管理器。
了解任务管理器和他们的记忆信息
我们已经对Android的任务管理器具有悠久的历史。
Android的一贯支持深表多任务处理,这意味着我们的怪异往往会希望有一些UI的观察和控制这种多任务像传统的UI,我们从桌面使用。
然而,在多任务的Android其实是相当多复杂,比传统的桌面操作系统有着根本的不同,因为我以前覆盖多任务Android的方式 。
这深深地影响如何,我们可以把它展示给用户。
多任务处理和连续的过程管理
为了得到一个感觉是多么不同的流程管理是在Android上,你可以看看在一个重要的系统服务的输出,活动管理,与adbshelldumpsysactivity 。
下面的例子显示了Android4.4系统的当前应用程序进程的快照,从最重要的上市他们至少有:
ACTIVITYMANAGERRUNNINGPROCESSES(dumpsysactivityprocesses)
ProcessLRUlist(sortedbyoom_adj,22total,non-actat2,non-svcat2):
PERS#21:
sysF//Ptrm:
023064:
system/1000(fixed)
PERS#20:
persF//Ptrm:
023163:
com.android.systemui/u0a12(fixed)
PERS#19:
persF//Ptrm:
023344:
com.nuance.xt9.input/u0a77(fixed)
PERS#18:
persF//Ptrm:
023357:
com.android.phone/1001(fixed)
PERS#17:
persF//Ptrm:
023371:
com.android.nfc/1027(fixed)
Proc#3:
foreF//IBtrm:
013892:
com.google.android.apps.magazines/u0a59(service)
com.google.android.apps.magazines/com.google.apps.dots.android.app.service.SyncService<=Proc{23064:
system/1000}
Proc#2:
foreF//IBtrm:
023513:
com.google.process.gapps/u0a8(provider)
com.google.android.gsf/.gservices.GservicesProvider<=Proc{13892:
com.google.android.apps.magazines/u0a59}
Proc#0:
foreF/A/Ttrm:
024811:
com.android.settings/1000(top-activity)
Proc#4:
visF//IFtrm:
023472:
com.google.process.location/u0a8(service)
com.google.android.backup/.BackupTransportService<=Proc{23064:
system/1000}
Proc#14:
prcpF//IFtrm:
023298:
com.google.android.inputmethod.latin/u0a57(service)
com.google.android.inputmethod.latin/com.android.inputmethod.latin.LatinIME<=Proc{23064:
system/1000}
Proc#1:
homeB//HOtrm:
023395:
com.android.launcher/u0a13(home)
Proc#16:
cchB//CAtrm:
023966:
com.google.android.deskclock/u0a36(cch-act)
Proc#6:
cchB//CEtrm:
07716:
com.google.android.music:
main/u0a62(cch-empty)
Proc#5:
cchB//CEtrm:
08644:
com.google.android.apps.docs/u0a39(cch-empty)
Proc#8:
cch+2B//CEtrm:
05131:
com.google.android.youtube/u0a78(cch-empty)
Proc#7:
cch+2B//CEtrm:
023338:
com.google.android.gms/u0a8(cch-empty)
Proc#10:
cch+4B//CEtrm:
08937:
com.google.android.apps.walletnfcrel/u0a24(cch-empty)
Proc#9:
cch+4B//CEtrm:
024689:
com.google.android.apps.plus/u0a70(cch-empty)
Proc#15:
cch+6B//Strm:
023767:
com.google.android.apps.currents/u0a35(cch-started-services)
Proc#13:
cch+6B//CEtrm:
09115:
com.google.android.gm/u0a44(cch-empty)
Proc#12:
cch+6B//Strm:
07738:
android.process.media/u0a6(cch-started-services)
Proc#11:
cch+6B//CEtrm:
08922:
com.google.android.setupwizard/u0a19(cch-empty)
例如输出dumpsys活动的命令,显示所有进程正在运行。
有过程的几个主要群体在这里-持续的系统进程中,前台进程,后台进程,最后缓存的过程-和进程的类别是了解其对系统的影响非常重要。
与此同时,这个名单上的进程改变所有的时间。
例如,在上面的快照,我们可以看到,“com.google.android.gm”是目前一个重要的过程,但是这是因为它是做一个后台同步,一些用户通常不知道或者想要管理。
快照每个进程的内存使用
传统的使用任务管理器是紧密联系在一起的RAM使用,而Android提供了一个工具,称为meminfo的望着当前每个进程的RAM使用快照。
你可以用命令访问 亚行外壳dumpsysmeminfo中。
下面是输出的一个例子。
TotalPSSbyOOMadjustment:
31841kB:
Native
13173kB:
zygote(pid23001)
4372kB:
surfaceflinger(pid23000)
3721kB:
mediaserver(pid126)
3317kB:
glgps(pid22993)
1656kB:
drmserver(pid125)
995kB:
wpa_supplicant(pid23148)
786kB:
netd(pid121)
518kB:
sdcard(pid132)
475kB:
vold(pid119)
458kB:
keystore(pid128)
448kB:
/init(pid1)
412kB:
adbd(pid134)
254kB:
ueventd(pid108)
238kB:
dhcpcd(pid10617)
229kB:
tf_daemon(pid130)
200kB:
installd(pid127)
185kB:
dumpsys(pid14207)
144kB:
healthd(pid117)
139kB:
debuggerd(pid122)
121kB:
servicemanager(pid118)
48217kB:
System
48217kB:
system(pid23064)
49095kB:
Persistent
34012kB:
com.android.systemui(pid23163/activities)
7719kB:
com.android.phone(pid23357)
4676kB:
com.android.nfc(pid23371)
2688kB:
com.nuance.xt9.input(pid23344)
24945kB:
Foreground
24945kB:
com.android.settings(pid24811/activities)
17136kB:
Visible
14026kB:
com.google.process.location(pid23472)
3110kB:
com.android.defcontainer(pid13976)
6911kB:
Perceptible
6911kB:
com.google.android.inputmethod.latin(pid23298)
14277kB:
AServices
14277kB:
com.google.process.gapps(pid23513)
26422kB:
Home
26422kB:
com.android.launcher(pid23395/activities)
21798kB:
BServices
16242kB:
com.google.android.apps.currents(pid23767)
5556kB:
android.process.media(pid7738)
145869kB:
Cached
41588kB:
com.google.android.apps.plus(pid24689)
21417kB:
com.google.android.deskclock(pid23966/activities)
14463kB:
com.google.android.apps.docs(pid8644)
14303kB:
com.google.android.gm(pid9115)
11014kB:
com.google.android.music:
main(pid7716)
10688kB:
com.google.android.apps.magazines(pid13892)
10240kB:
com.google.android.gms(pid23338)
9882kB:
com.google.android.youtube(pid5131)
8807kB:
com.google.android.apps.walletnfcrel(pid8937)
3467kB:
com.google.android.setupwizard(pid8922)
TotalRAM:
998096kB
FreeRAM:
574945kB(145869cachedpss+393200cached+35876free)
UsedRAM:
392334kB(240642usedpss+107196buffers+3856shmem+40640slab)
LostRAM:
30817kB
Tuning:
64(large384),oom122880kB,restorelimit40960kB(high-end-gfx)
例如输出dumpsysmeminfo中的命令,显示目前使用的正在运行的进程的内存。
我们现在看到的上面,按重要性再次组织同样的过程,但现在他们对RAM的使用影响。
通常,当我们衡量的AndroidRAM的使用,我们这样做的Linux的PSS(比例集大小)的度量。
这是RAM的数量实际上映射到进程,但它是跨进程共享的量加权。
因此,如果有RAM的4K页映射到两个过程,其PSS量对于每个过程将是2K。
有关使用PSS的好处是,你可以添加了这个值,所有的进程来确定实际的总RAM使用。
这个特性被用在所述的端部meminfo报告来计算多少RAM在使用时(其中部分来自所有非高速缓存过程),对有多少是“免费”的(其中包括高速缓存过程)。
任务管理器风格的内存信息,显示内存使用正在运行的应用的快照。
基于PSS快照任务管理器UI
给我们的资料,到目前为止,我们可以想象各种方式在一定程度传统任务管理器UI展示这一点。
其实,你在设置看到UI>应用程序>运行从该信息导出。
它显示正在运行的服务(在LRU列表“SVC”调整)所有进程和代系统(过程与“<={PROC489:
系统/1000}”依赖),计算PSSRAM为每个这些和他们有任何其他进程依赖于。
与可视化内存使用这种方式的问题在于,它给你的应用程序的即时状态,没有上下文随着时间的推移。
在Android上,用户不直接控制应用程序的创建和删除-他们可以保留以备将来使用,移除时的系统决定,或者在后台运行,而无需用户明确启动它们。
所以只看内存的即时状态只使用,您将得到缺少有关什么是真正打算在一段时间内的重要信息。
例如,在我们先来看看进程状态,我们看到com.google.android.apps.magazines进程中运行的同步,但是当我们收集到的RAM使用权后,它不再在后台运行,但只是被围绕保持作为一个老缓存的过程。
为了解决这个问题,新的procstats工具连续监控所有的应用程序的状态随着时间的推移 ,聚集该信息,并收集PSS样品从那些过程,而这样做。
您可以查看正在收集procstats用命令的原始数据adbshelldumpsysprocstats 。
随着时间的推移procstats看到内存使用
现在,让我们回到procstats并看看它提供了通过显示随着时间的推移内存使用的上下文。
我们可以使用命令adbshelldumpsysprocstats--hours3收集了近3个小时的输出内存信息。
这是相同的数据,在第一处理例的统计图形表示。
输出显示所有已在过去三小时的运行过程中,整理与运行最先那些的。
(在缓存状态的进程不指望在这种的总时间。
)像最初的图形表示,现在我们清楚地看到了那个时间运行的所有进程一个大组,然后一些偶尔运行-这包括该杂志的过程中,我们现在可以看到跑的时候3.6%,在过去3小时。
*com.google.android.inputmethod.latin/u0a57:
TOTAL:
100%(6.4MB-6.7MB-6.8MB/5.4MB-5.4MB-5.4MBover21)
ImpFg:
100%(6.4MB-6.7MB-6.8MB/5.4MB-5.4MB-5.4MBover21)
*com.google.process.gapps/u0a8:
TOTAL:
100%(12MB-13MB-14MB/10MB-11MB-12MBover211)
ImpFg:
0.11%
ImpBg:
0.83%(13MB-13MB-13MB/11MB-11MB-11MBover1)
Service:
99%(12MB-13MB-14MB/10MB-11MB-12MBover210)
*com.android.systemui/u0a12:
TOTAL:
100%(29MB-32MB-34MB/26MB-29MB-30MBover21)
Persistent:
100%(29MB-32MB-34MB/26MB-29MB-30MBover21)
*com.android.phone/1001:
TOTAL:
100%(6.5MB-7.1MB-7.6MB/5.4MB-5.9MB-6.4MBover21)
Persistent:
100%(6.5MB-7.1MB-7.6MB/5.4MB-5.9MB-6.4MBover21)
*com.nuance.xt9.input/u0a77:
TOTAL:
100%(2.3MB-2.5MB-2.7MB/1.5MB-1.5MB-1.5MBover21)
Persistent:
100%(2.3MB-2.5MB-2.7MB/1.5MB-1.5MB-1.5MBover21)
*com.android.nfc/1027:
TOTAL:
100%(4.2MB-4.5MB-4.6MB/3.2MB-3.2MB-3.3MBover21)
Persistent:
100%(4.2MB-4.5MB-4.6MB/3.2MB-3.2MB-3.3MBover21)
*com.google.process.location/u0a8:
TOTAL:
100%(13MB-13MB-14MB/10MB-11MB-11MBover21)
ImpFg:
100%(13MB-13MB-14MB/10MB-11MB-11MBover21)
*system/1000:
TOTAL:
100%(42MB-46MB-56MB/39MB-42MB-48MBover21)
Persistent:
100%(42MB-46MB-56MB/39MB-42MB-48MBover21)
*com.google.android.apps.currents/u0a35:
TOTAL:
100%(16MB-16MB-16MB/14MB-14MB-14MBover17)
Service:
100%(16MB-16MB-16MB/14MB-14MB-14MBover17)
*com.android.launcher/u0a13:
TOTAL:
77%(25MB-26MB-27MB/22MB-23MB-24MBover73)
Top:
77%(25MB-26MB-27MB/22MB-23MB-24MBover73)
(Home):
23%(25MB-26MB-26MB/23MB-23MB-24MBover12)
*android.process.media/u0a6:
TOTAL:
48%(5.0MB-5.3MB-5.5MB/4.0MB-4.2MB-4.2MBover11)
ImpFg:
0.00%
ImpBg:
0.00%
Service:
48%(5.0MB-5.3MB-5.5MB/4.0MB-4.2MB-4.2MBover11)
Receiver:
0.00%
(Cached):
22%(4.1MB-4.5MB-4.8MB/3.0MB-3.5MB-3.8MBover8)
*com.google.android.deskclock/u0a36:
TOTAL:
42%(20MB-21MB-21MB/18MB-19MB-19MBover8)
ImpFg:
42%(20MB-21MB-21MB/18MB-19MB-19MBover8)
Servic