android 内存泄露诊断

meminfo

[plain] view plain copy
  1. cat /proc/meminfo                                               
  2.   
  3. MemTotal:        1922108 kB  
  4. MemFree:          230964 kB  
  5. Buffers:           23960 kB  
  6. Cached:           550796 kB  
  7. SwapCached:            0 kB  
  8. Active:           980992 kB  
  9. Inactive:         470032 kB  
  10. Active(anon):     876316 kB  
  11. Inactive(anon):      884 kB  
  12. Active(file):     104676 kB  
  13. Inactive(file):   469148 kB  
  14. Unevictable:           0 kB  
  15. Mlocked:               0 kB  
  16. HighTotal:       1181696 kB  
  17. HighFree:           4000 kB  
  18. LowTotal:         740412 kB  
  19. LowFree:          226964 kB  
  20. SwapTotal:             0 kB  
  21. SwapFree:              0 kB  
  22. Dirty:                56 kB  
  23. Writeback:             0 kB  
  24. AnonPages:        876356 kB  
  25. Mapped:           179344 kB  
  26. Shmem:               948 kB  
  27. Slab:              50208 kB  
  28. SReclaimable:      18688 kB  
  29. SUnreclaim:        31520 kB  
  30. KernelStack:        9712 kB  
  31. PageTables:        22272 kB  
  32. NFS_Unstable:          0 kB  
  33. Bounce:                0 kB  
  34. WritebackTmp:          0 kB  
  35. CommitLimit:      961052 kB  
  36. Committed_AS:   23739364 kB  
  37. VmallocTotal:     122880 kB  
  38. VmallocUsed:       30024 kB  
  39. VmallocChunk:      59236 kB  

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


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

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

free

[plain] view plain copy
  1. <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

[plain] view plain copy
  1. [email protected]:/ # procrank                                                        
  2.   
  3.   PID       Vss      Rss      Pss      Uss  cmdline  
  4.  3608  1432368K   86644K   53211K   47696K  system_server  
  5.  1155    80172K   34712K   31776K   29616K  node-core-cluster  
  6.  3317  1296488K   54320K   20553K   14636K  zygote  
  7.  4943   719552K   49108K   19842K   16960K  com.android.phone  
  8.  4346   699176K   39872K   12681K   10588K  android.process.media  
  9.  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。
解压后目录内容如下:

[plain] view plain copy
  1. <img src="https://img-blog.****.net/20170122104534647?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hpY2hhb2c=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">  
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,然后可以使用如下命令打开

[email protected]:~/Downloads/mat$ ./MemoryAnalyzer XXX/smspush-b.hprof 

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


hprof文件通过ddms获取

android 内存泄露诊断

systrace

android 内存泄露诊断

打开的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"