android 性能分析

来源:互联网 发布:js select foreach 编辑:程序博客网 时间:2024/05/16 10:25

android性能分析

下载bug项目:https://github.com/lzyzsd/MemoryBugs,请注意配合使用MemoryMonitor AllocationTracker以及HeapDumpLeakCanary等工具来查找潜在的内存问题,并尝试解决。

1.测试工具介绍

(1)memory monitor简介

AndroidStudio提供了Memory Monitor来实时显示应用运行时内存占用情况,下边蓝色部分是现在占用的内存,上面灰色的部分显示是已回收的内存。如果在图上看到尖峰,也就是快速分配内存又被回收,也就是发生了内存抖动,这里就是需要优化的地方。在模拟器或者真机中Debug项目,可实时监看Memory,CPUNetWork等的资源占用情况。


(2)Allocation Tracker简介

单击Allocation tracker标签,就会打开一个新的窗口,单击“Start Tracing”按钮;然后,让应用运行你想分析的代码。运行完毕后,单击“Get Allocations”按钮,一个已分配对象的列表就会出现第一个表格中。

单击第一个表格中的任何一项,在表格二中就会出现导致该内存分配的栈跟踪信息。通过allocation tracker,不仅知道分配了哪类对象,还可以知道在哪个线程、哪个类、哪个文件的哪一行。

轮胎图是以圆心为起点,最外层是其内存实际分配的对象,每一个同心圆可能被分割成多个部分,代表了其不同的子孙,每一个同心圆代表他的一个后代,每个分割的部分代表了某一带人有多人,双击某个同心圆中某个分割的部分,会变成以你点击的那一代为圆心再向外展开。如果想回到原始状态,双击圆心就可以了。

2.案例分析

(1)内存波动

bug项目中存在内存波动,由案例中如下段代码产生:

for (int i = 0; i <10000; i++) {

           Rect rect = new Rect(0, 0, 100,100);

            System.out.println("-------:" + rect.width());

        }

改进方案

修改将对象在循环体外创建,具体代码修改如下:

private  Rectrect = new Rect(0, 0, 100, 100);

for (int i = 0; i <10000; i++) {

            System.out.println("-------: " +rect.width());

        }

(2)内存泄露

   bug项目中使用Handler造成内存泄露的代码如下:

Handler mHandler = new Handler() {

     @Override

     public voidhandleMessage(Message msg) {

        mImageView.setImageBitmap(mBitmap);

     }

}

改进方案

   public static class MyHandler extendsHandler {

            WeakReference<MainActivity >mActivityReference;

            MyHandler(MainActivity activity) {

            mActivityReference= newWeakReference<MainActivity>(activity);

                 }

       @Override

       public void handleMessage(Message msg) {

                   final MainActivity activity= mActivityReference.get();

                   if (activity != null) {

                    return;

                   }

       }

   }

0 0
原创粉丝点击