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:被高速缓冲存储器用的交换空间的大小,已经被交换出来的内存。
MemFree 327096kB
Buffers 45512kB
Cached 558316kB
可用内存=Memfree+Cached=327096kB+558316kB~=865MB
应用程序+框架=MemTotal-(Memfree+Cached)~=1877MB-865MB~=1012MB。
free
- <img src="https://img-blog.****.net/20170121134236273?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hpY2hhb2c=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
/proc/pid/maps pid为进程号,显示当前进程所占用的虚拟地址。
procrank
- [email protected]:/ # 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
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。
解压后目录内容如下:
- <img src="https://img-blog.****.net/20170122104534647?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hpY2hhb2c=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
./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,然后可以使用如下命令打开
[email protected]:~/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"