一个app流畅不流畅,用一会儿就有感觉了
但是我们可以通过专业分析工具来更好的分析我们的应用
如果不考虑使用其他第三方性能分析工具,我们可以直接使用ddms中的工具
ddms中有traceview, heap, allocaton tracker 都可以帮助我们分析应用的方法执行时间效率和内存使用情况
heap工具可以帮助我们检查代码中是否存在会造成内存泄漏的地方
用heap监测应用进程使用内存情况的步骤如下:
1.启动eclipse后,切换到DDMS视图,确认Devices,heap视图都是打开的
2.点击选中想要监测的进程,比如system_process
3.点击选中Devices视图界面中最上方一排图标中的”Update Heap”图标
4.点击Heap视图中的”Cause GC”按钮
5.此时在Heap视图中就可以看到当前选中的进程的内存使用的详细情况
1.点击”Cause GC”按钮相当于向虚拟机请求了一次gc操作
2.当内存使用信息第一次显示以后,不用再点击”Cause GC”,Heap视图界面会定时刷新
在对应用的不断操作过程中就可以看到内存使用变化
3.如何才能知道我们的程序是否有内存泄漏的可能性呢。这里需要注意一个值:Heap 视图中部有一个 Type
叫做 data object,即数据对象,也就是我们的程序中大量存在的类类型的对象。在 data object 一行中有一列是
“Total Size”,其值就是当前进程中所有 Java 数据对象的内存总量,一般情况下,这个值的大小决定了是否会
有内存泄漏。
1.不断的操作当前应用,同时注意观察 data object 的 Total Size 值;
2.正常情况下 Total Size 值都会稳定在一个有限的范围内,也就是说由于程序中的的代码良好,没有造成对
象不被垃圾回收的情况,所以说虽然我们不断的操作会不断的生成很多对象,而在虚拟机不断的进行 GC 的过程
中,这些对象都被回收了,内存占用量会会落到一个稳定的水平;
3.反之如果代码中存在没有释放对象引用的情况,则 data object 的 Total Size 值在每次 GC 后不会有明显
的回落,随着操作次数的增多 Total Size 的值会越来越大,直到到达一个上限后导致进程被 kill 掉。
4.此处以 system_process 进程为例, 在我的测试环境中 system_process 进程所占用的内存的 data object
的 Total Size 正常情况下会稳定在 2.2~2.8 之间,而当其值超过 3.55 后进程就会被 kill。
总之,使用 DDMS 的 Heap 视图工具可以很方便的确认我们的程序是否存在内存泄漏的可能性。
运行 DDMS,只需简单的选择应用进程并单击 Allocation tracker 标签,就会打开一个新的窗口,单击“Start
Tracing”按钮;
然后,让应用运行你想分析的代码。运行完毕后,单击“Get Allocations”按钮,一个已分配对象的列表就会出
现第一个表格中。
单击第一个表格中的任何一项,在表格二中就会出现导致该内存分配的栈跟踪信息。通过 allocation tracker,不
仅知道分配了哪类对象,还可以知道在哪个线程、哪个类、哪个文件的哪一行。