android 内存泄露诊断

meminfo

cat /proc/meminfo                                             

MemTotal:        1922108 kB
MemFree:          230964 kB
Buffers:           23960 kB
Cached:           550796 kB
SwapCached:            0 kB
Active:           980992 kB
Inactive:         470032 kB
Active(anon):     876316 kB
Inactive(anon):      884 kB
Active(file):     104676 kB
Inactive(file):   469148 kB
Unevictable:           0 kB
Mlocked:               0 kB
HighTotal:       1181696 kB
HighFree:           4000 kB
LowTotal:         740412 kB
LowFree:          226964 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                56 kB
Writeback:             0 kB
AnonPages:        876356 kB
Mapped:           179344 kB
Shmem:               948 kB
Slab:              50208 kB
SReclaimable:      18688 kB
SUnreclaim:        31520 kB
KernelStack:        9712 kB
PageTables:        22272 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:      961052 kB
Committed_AS:   23739364 kB
VmallocTotal:     122880 kB
VmallocUsed:       30024 kB
VmallocChunk:      59236 kB

MemTotal:系统总的物理内存大小
MemFree:物理内存大小,系统未使用。
Buffers:用来给文件做缓冲的大小
Cached:高速缓冲存储器用的内存大小
SwapCached:被高速缓冲存储器用的交换空间的大小,已经被交换出来的内存。
MemTotal   1922108kB
MemFree 327096kB
Buffers     45512kB
Cached 558316kB


可用内存=Memfree+Cached=327096kB+558316kB~=865MB

应用程序+框架=MemTotal-(Memfree+Cached)~=1877MB-865MB~=1012MB。

free


/proc/pid/maps pid为进程号,显示当前进程所占用的虚拟地址。

procrank

root@msm8974:/ # procrank                                                      

  PID       Vss      Rss      Pss      Uss  cmdline
 3608  1432368K   86644K   53211K   47696K  system_server
 1155    80172K   34712K   31776K   29616K  node-core-cluster
 3317  1296488K   54320K   20553K   14636K  zygote
 4943   719552K   49108K   19842K   16960K  com.android.phone
 4346   699176K   39872K   12681K   10588K  android.process.media
 4793   699832K   38656K   12234K   10492K  android.process.acore
VSS:等同于ps命令列出的VSZ,是单个进程全部可访问的地址空间。

RSS:单个进程实际占用的内存大小,包括进程所使用的所有共享库的全部内存大小。对于单个共享库,尽管无论多少进程使用,实际该共享库只会被装入内存一次。

PSS:按比例包含其所使用的库大小。

USS:进程的全部私有内存大小,如果进程退出,其将被返还给系统,对于可疑的内存泄漏,该数字可用于进行监控。

内存泄漏诊断

DDMS 内存工具

安装android studio,见<Ubuntu 命令行安装android studio>
当然也可以直接sudo apt-get install ddms进行安装,个人觉得android studio环境自带的还是比较好使用的。

Memory Analyzer Tool

其是一个Java堆分析工具,可以用来查找内存泄漏以及减少内存消耗。可以用来分析java堆dump
下载地址<http://www.eclipse.org/mat/downloads.php>,我下载的是<Linux (x86_64/GTK 2)>stand alone版本,这样可以不安装eclipse,在使用ddms时安装了android studio。
解压后目录内容如下:

standalone版本需要进行格式转储

./out/host/linux-x86/bin/hprof-conv ~/com.android.smspush.hprof smspush-b.hprof

hprof-conv工具在编译完成的目录下可以找到,实际上所在位置是sdk/tools/hprof-conv a.hprof b.hprof。在解压后的目录下可以找到MemoryAnalyzer,然后可以使用如下命令打开

gsc@gsc-250:~/Downloads/mat$ ./MemoryAnalyzer XXX/smspush-b.hprof

当然也可以打开窗口后再open file。


hprof文件通过ddms获取

systrace


打开的chrome使用如下的版本:

wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb

sudo dpkg -i google-chrome*; sudo apt-get -f install
然后,就可以去搜索使用了。

系统卡顿

卡顿是一种常见的性能问题,涉及到比较多的模块。例如CPU scheduler,CPU governor,LPM,HWUI,display合成,surfaceFlinger,openGL,GPU性能,UI framework等,需要使用systrace log来进行初步的分析。

当出现此问题时,请enable下面的event并开始抓取systrace log

adb shell "echo sched:sched_mi"

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shichaog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值