步骤:
1.mokey测试命令:
adb -d 设备名 monkey -s 5 -p 包名 --throttle 1000 --pct-touch 43 --pct-motion 18 --pct-trackball 15 --pct-nav 5 --pct-
majornav 10 --pct-appswitch 2 --pct-flip 0 --pct-anyevent 0 --kill-process-after-error --monitor-native-crashes -v -v
2.DDMS->选中需查看的进程->update heap->Cause GC 查看内存占用情况。(内存大小是动态分配的)。
3.DDMS->选中需查看的进程->Dump HPROF file 。通过hprof-conv 命令转换文件。通过MAT Eclipse插件, 在memory analysis中打开该文
件进行内存详细分析(在程序快要内存溢出前抓取)。
a.android中,除了resource,bitmap,等占用内存大外,如果还有其它对象占用很多内存说明有问题。
b.分析对象个数,跟实际使用数目对比。
c.同样一个对象,内存占用情况对比。
经验:
1.一个界面里的图片多而大的话,bitmap需要做缩放。(针对一进入该界面就内存溢出的情况)。
2.少用全局的静态变量。用了要及时值空。
3.列表需要及时清空。
4.图片的全局缓存,用弱引用。保证内存不够的时候能GC。
1.mokey测试命令:
adb -d 设备名 monkey -s 5 -p 包名 --throttle 1000 --pct-touch 43 --pct-motion 18 --pct-trackball 15 --pct-nav 5 --pct-
majornav 10 --pct-appswitch 2 --pct-flip 0 --pct-anyevent 0 --kill-process-after-error --monitor-native-crashes -v -v
5000000 > d:\log.txt
需要检查你的程序多久会内存溢出。
2.DDMS->选中需查看的进程->update heap->Cause GC 查看内存占用情况。(内存大小是动态分配的)。
进入一个界面,退出,再GC 。重复多次。如果内存不断增加。说明有内存溢出。
这个方法只针对你知道或者怀疑某个界面有内存溢出。更详细的分析你需要借助下面提到的工具。
3.DDMS->选中需查看的进程->Dump HPROF file 。通过hprof-conv 命令转换文件。通过MAT Eclipse插件, 在memory analysis中打开该文
件进行内存详细分析(在程序快要内存溢出前抓取)。
a.android中,除了resource,bitmap,等占用内存大外,如果还有其它对象占用很多内存说明有问题。
b.分析对象个数,跟实际使用数目对比。
c.同样一个对象,内存占用情况对比。
经验:
1.一个界面里的图片多而大的话,bitmap需要做缩放。(针对一进入该界面就内存溢出的情况)。
2.少用全局的静态变量。用了要及时值空。
3.列表需要及时清空。
4.图片的全局缓存,用弱引用。保证内存不够的时候能GC。
5.View缓存需要及时清理。
6.长生命周期里的对象不要引用短生命周期的对象(保证主与activity相关的对象能及时回收)。
7.虚拟机只自动回收那些与root节点(主Activity,service)没有引用的对象。