码迷,mamicode.com
首页 > 移动开发 > 详细

第8章 Android异常与性能优化相关面试问题

时间:2018-03-15 19:16:55      阅读:240      评论:0      收藏:0      [点我收藏+]

标签:thread   bsp   oom   如何   异常   引用   其它   提高优先级   算法   

1、anr异常面试问题讲解

  a)  什么是anr?

    应用程序无响应对话框

  b)  造成anr的原因?

    主线程中做了耗时操作

  c)  android中那些操作是在主线程呢?

    activity的所有生命周期回调都是执行在主线程的

    Service默认是执行在主线程的

    BroadcastReceiver的onReceiver回调是执行在主线程的

    没有使用子线程的Looper的Handler的handlerMessage,post(Runnable)是执行在主线程的

    AsyncTask的回调中除了doInBackground,其它都是执行在主线程

  d)  如何解决anr

    使用AsyncTask处理耗时IO操作

    使用Thread或者HandlerThread提高优先级

    使用handler来处理工作线程的耗时任务

    activity的onCreate和onResume回调中尽量避免耗时的代码

 

2、oom异常面试问题讲解

  a)  什么是oom ?

    当前占用的内存加上我们申请的内存资源超过了Dalvik虚拟机的最大内存限制就会抛出的Out  of  memory异常 

  b)  一些容易混淆的概念

   内存溢出 / 内存抖动 / 内存泄漏

   内存溢出:就是oom

   内存抖动:短时间内大量对象被创建然后马上被释放

   内存泄漏:当程序不再使用到的内存时,释放内存失败而产生了无用的内存消耗

  d) 如何解决oom

   1.有关bitmap优化

    图片显示(比如监听listview滑动,停止的时候加载大图)

    及时释放内存

      bitmap的够着方法都是私有的,通过BitmapFactory生成Bitmap到内存中都是通过jni实现的,简单点说会有俩部分区域,一部分是java区,一部分是C区,但是Bitmap是通过java分配的,不用的时候也是由java的gc机制回收的。对应C区域不能及时回收的,所以这里说的释放内存就是释放的c的那块区域(通过

recycle方法,该方法内部调用了jni的方法)。要是不释放只能等进程死了以后就会被释放
   图片压缩
   inBitmap属性(图片复用)
   捕获异常   

   2.其它方法

    listview:convertview / lru(三级缓存)

    避免在onDraw方法里面执行对象的创建

    谨慎使用多进程

 

3、 bitmap面试问题讲解

  a)  recycle :释放bitmap内存的时候会释放所对应的native的内存,但是不会立即释放,但是调用完就不能使用该bitmap了,是不可逆的。官方不建议主动调用。垃圾回收器主动会清理。

  b)  LRU:三级缓存,内部是通过map实现的,里面提供了put、get方法来完成缓存的添加和获取操作。当缓存满的时候,lru算法会提供trimToSize删除最久或者使用最少的缓存对象,添加新的缓存对象

  c)  计算inSampleSize:

  d)  缩略图

    

 /**
     * 获取缩略图
     * @param imagePath:文件路径
     * @param width:缩略图宽度
     * @param height:缩略图高度
     * @return
     */
    public static Bitmap getImageThumbnail(String imagePath, int width, int height) {
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true; //关于inJustDecodeBounds的作用将在下文叙述
        Bitmap bitmap = BitmapFactory.decodeFile(imagePath, options);
        int h = options.outHeight;//获取图片高度
        int w = options.outWidth;//获取图片宽度
        int scaleWidth = w / width; //计算宽度缩放比
        int scaleHeight = h / height; //计算高度缩放比
        int scale = 1;//初始缩放比
        if (scaleWidth < scaleHeight) {//选择合适的缩放比
            scale = scaleWidth;
        } else {
            scale = scaleHeight;
        }
        if (scale <= 0) {//判断缩放比是否符合条件
            be = 1;
        }
        options.inSampleSize = scale;
        // 重新读入图片,读取缩放后的bitmap,注意这次要把inJustDecodeBounds 设为 false
                options.inJustDecodeBounds = false;
                bitmap = BitmapFactory.decodeFile(imagePath, options);
        // 利用ThumbnailUtils来创建缩略图,这里要指定要缩放哪个Bitmap对象
        bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height,ThumbnailUtils.OPTIONS_RECYCLE_INPUT);
        return bitmap;
    }

 

  e)  三级缓存

    网络、本地、内存三级缓存,减少流量的使用

 

4、 ui卡顿面试问题讲解

  a)  UI卡顿的原理

    60fps -> 16ms    

    overdraw过度绘制 

  b)  UI卡顿的原因分析

    1.人为在UI线程中做轻微耗时操作,导致UI线程卡顿

    2.布局Layout过于复杂,无法在16ms内完成渲染

    3.同一时间动画执行的次数过多,导致CPU、GPU的负载过重

    4.View的过度绘制,导致某些像素在同一帧内被绘制多次,从而使CPU、GPU的负载过重

    5.View频繁的触发measure、layout,导致measure、layout累计耗时过多及整个View频繁的重新渲染

    6.内存频繁触发gc过多,导致暂时阻塞渲染操作

    7.冗余资源及逻辑等导致加载和执行的缓慢

    8.ANR

  c)  UI卡顿总结

    1.布局优化

    2.列表及adapter优化

    3.背景和图片等内存分配优化

    4.避免ANR

 

4、 内存泄漏

  a)  java内存泄漏基础知识

    1.  java内存的分配策略

      静态存储区(方法区):主要存放静态数据、全局 static 数据和常量。这块内存在程序编译时就已经分配好,并且在程序整个运行期间都存在。

      栈区:当方法被执行时,方法体内的局部变量(其中包括基础数据类型、对象的引用)都在栈上创建,并在方法执行结束时这些局部变量所持有的内存将会自动被释放。因为栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

      堆区 : 又称动态内存分配,通常就是指在程序运行时直接 new 出来的内存,也就是对象的实例。这部分内存在不使用时将会由 Java 垃圾回收器来负责回收。

    2.  java是如何管理内存的

          技术分享图片

 

    3.  java中的内存泄漏

      内存泄漏是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成的内存空间的浪费称为内存泄漏

  b)  android内存泄漏

 

第8章 Android异常与性能优化相关面试问题

标签:thread   bsp   oom   如何   异常   引用   其它   提高优先级   算法   

原文地址:https://www.cnblogs.com/zhaojianhua/p/8574136.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!