ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2021Android高频精选面试题讲解,架构师必备!

2021-07-07 21:56:33  阅读:120  来源: 互联网

标签:面试题 Java 2021Android 对象 广播 内存 架构师 Android 垃圾


# Java面试题 **1.GC机制** 垃圾回收需要完成两件事:找到垃圾,回收垃圾。 找到垃圾一般的话有两种方法: * **引用计数法:**?当一个对象被引用时,它的引用计数器会加一,垃圾回收时会清理掉引用计数为0的对象。但这种方法有一个问题,比方说有两个对象 A 和 B,A 引用了 B,B 又引用了 A,除此之外没有别的对象引用 A 和 B,那么 A 和 B 在我们看来已经是垃圾对象,需要被回收,但它们的引用计数不为 0,没有达到回收的条件。正因为这个循环引用的问题,Java 并没有采用引用计数法。 * **可达性分析法:**?我们把 Java 中对象引用的关系看做一张图,从根级对象不可达的对象会被垃圾收集器清除。根级对象一般包括 Java 虚拟机栈中的对象、本地方法栈中的对象、方法区中的静态对象和常量池中的常量。 回收垃圾的话有这么四种方法: * **标记清除算法:**?顾名思义分为两步,标记和清除。首先标记到需要回收的垃圾对象,然后回收掉这些垃圾对象。标记清除算法的缺点是清除垃圾对象后会造成内存的碎片化。 * **复制算法:**?复制算法是将存活的对象复制到另一块内存区域中,并做相应的内存整理工作。复制算法的优点是可以避免内存碎片化,缺点也显而易见,它需要两倍的内存。 * **标记整理算法:**?标记整理算法也是分两步,先标记后整理。它会标记需要回收的垃圾对象,清除掉垃圾对象后会将存活的对象压缩,避免了内存的碎片化。 * **分代算法:**?分代算法将对象分为新生代和老年代对象。那么为什么做这样的区分呢?主要是在Java运行中会产生大量对象,这些对象的生命周期会有很大的不同,有的生命周期很长,有的甚至使用一次之后就不再使用。所以针对不同生命周期的对象采用不同的回收策略,这样可以提高GC的效率。 新生代对象分为三个区域:Eden 区和两个 Survivor 区。新创建的对象都放在 Eden区,当 Eden 区的内存达到阈值之后会触发 Minor GC,这时会将存活的对象复制到一个 Survivor 区中,这些存活对象的生命存活计数会加一。这时 Eden 区会闲置,当再一次达到阈值触发 Minor GC 时,会将Eden区和之前一个 Survivor 区中存活的对象复制到另一个 Survivor 区中,采用的是我之前提到的复制算法,同时它们的生命存活计数也会加一。 这个过程会持续很多遍,直到对象的存活计数达到一定的阈值后会触发一个叫做晋升的现象:新生代的这个对象会被放置到老年代中。 老年代中的对象都是经过多次 GC 依然存活的生命周期很长的 Java 对象。当老年代的内存达到阈值后会触发 Major GC,采用的是标记整理算法。 **2.JVM内存区域的划分,哪些区域会发生 OOM** JVM 的内存区域可以分为两类:线程私有和区域和线程共有的区域。 线程私有的区域:程序计数器、JVM 虚拟机栈、本地方法栈 线程共有的区域:堆、方法区、运行时常量池 * **程序计数器。**?每个线程有有一个私有的程序计数器,任何时间一个线程都只会有一个方法正在执行,也就是所谓的当前方法。程序计数器存放的就是这个当前方法的JVM指令地址。 * **JVM虚拟机栈。**?创建线程的时候会创建线程内的虚拟机栈,栈中存放着一个个的栈帧,对应着一个个方法的调用。JVM 虚拟机栈有两种操作,分别是压栈和出站。栈帧中存放着局部变量表、方法返回值和方法的正常或异常退出的定义等等。 * **本地方法栈。**?跟 JVM 虚拟机栈比较类似,只不过它支持的是 Native 方法。 * **堆。**?堆是内存管理的核心区域,用来存放对象实例。几乎所有创建的对象实例都会直接分配到堆上。所以堆也是垃圾回收的主要区域,垃圾收集器会对堆有着更细的划分,最常见的就是把堆划分为新生代和老年代。 * 方法区。方法区主要存放类的结构信息,比如静态属性和方法等等。 * 运行时常量池。运行时常量池位于方法区中,主要存放各种常量信息。 其实除了程序计数器,其他的部分都会发生 OOM。 * **堆。**?通常发生的 OOM 都会发生在堆中,最常见的可能导致 OOM 的原因就是内存泄漏。 * **JVM虚拟机栈和本地方法栈。**?当我们写一个递归方法,这个递归方法没有循环终止条件,最终会导致 StackOverflow 的错误。当然,如果栈空间扩展失败,也是会发生 OOM 的。 * 方法区。方法区现在基本上不太会发生 OOM,但在早期内存中加载的类信息过多的情况下也是会发生 OOM 的。 **3.类加载过程** **4.双亲委派模型** **5.Java 中的集合类** **6.HashMap 的原理** **7.什么情况下 Java 会产生死锁,如何定位、修复,手写死锁** **8.sleep 和 wait 的区别** **9.join 的用法** **10.volatile和synchronize的区别** **11.Java中的线程池** **12.线程通信** **13.Java中的并发集合** **14.Java中生产者与消费者模式** **15.final、finally、finalize区别** **16.Java 中单例模式** **17.Java中引用类型的区别,具体的使用场景** **18.Exception 和 Error的区别** **19.volatile** ![](http://www.icode9.com/i/li/?n=2&i=images/20210707/1625663798628690.jpg) # 网络相关面试题 **1.http 状态码** **2.http 与 https 的区别?https 是如何工作的?** **3.TCP三次握手流程** ![](http://www.icode9.com/i/li/?n=2&i=images/20210707/1625663798410547.jpg) # Android面试题 **1.进程间通信的方式有哪几种** AIDL 、广播、文件、socket、管道 **2.广播静态注册和动态注册的区别** 1. 动态注册广播不是常驻型广播,也就是说广播跟随 Activity 的生命周期。注意在 Activity 结束前,移除广播接收器。 静态注册是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。 2. 当广播为有序广播时:优先级高的先接收(不分静态和动态)。同优先级的广播接收器,动态优先于静态 3. 同优先级的同类广播接收器,静态:先扫描的优先于后扫描的,动态:先注册的优先于后注册的。 4. 当广播为默认广播时:无视优先级,动态广播接收器优先于静态广播接收器。同优先级的同类广播接收器,静态:先扫描的优先于后扫描的,动态:先注册的优先于后册的。 **3.Android 性能优化工具使用(这个问题建议配合Android中的性能优化)** Android 中常用的性能优化工具包括这些:Android Studio 自带的 Android Profiler、LeakCanary、BlockCanary Android 自带的 Android Profiler 其实就很好用,Android Profiler 可以检测三个方面的性能问题:CPU、MEMORY、NETWORK。 LeakCanary 是一个第三方的检测内存泄漏的库,我们的项目集成之后 LeakCanary 会自动检测应用运行期间的内存泄漏,并将之输出给我们。 BlockCanary 也是一个第三方检测UI卡顿的库,项目集成后Block也会自动检测应用运行期间的UI卡顿,并将之输出给我们。 **4.Android中的类加载器** * PathClassLoader,只能加载系统中已经安装过的 apk * DexClassLoader,可以加载 jar/apk/dex,可以从 SD卡中加载未安装的 apk **5.Android中的动画有哪几类,它们的特点和区别是什么** **6.Handler 机制** **7.Android 性能优化** **8.Android 内存优化** **9.Binder 机制** **10.LruCache的原理** **11.DiskLruCache原理** **12.设计一个图片的异步加载框架** **13.Android中的事件分发机制** **14.View的绘制流程** **15.Android 源码中常见的设计模式以及自己在开发中常用的设计模式** **16.Android与 js 是如何交互的** **17.热修复原理** **18.Activity 启动过程** **19.SparseArray 原理** **20.图片加载如何避免 OOM** **21.大图加载** ![](http://www.icode9.com/i/li/?n=2&i=images/20210707/1625663798658841.jpg) # Android三方库的源码分析 **1.OkHttp** **2.Retrofit** **3.RxJava** **4.Glide** **5.EventBus** ![](http://www.icode9.com/i/li/?n=2&i=images/20210707/1625663798422090.jpg) # 数据结构与算法 **1.手写快排** **2.手写归并排序** **3.手写堆以及堆排序** **4.说一下排序算法的区别(时间复杂度和空间复杂度)** **工作中解决了什么难题,做了什么有成就感的项目(这个问题一定会问到,所以肯定要做准备)** ## 小结 有了这么多优秀的开发工具,可以做出更高质量的Android应用。 当然了,“**打铁还需自身硬**”,想要写出优秀的代码,最重要的一点还是自身的技术水平,不然用再好的工具也不能发挥出它的全部实力。 在这里我也分享一份大佬自己收录整理的**Android学习PDF+架构视频+面试文档+源码笔记**,还有**高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料**这些都是我闲暇还会反复翻阅的精品资料。在脑图中,每个知识点专题都配有相对应的实战项目,可以有效的帮助大家掌握知识点。 总之也是在这里帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习 如果你有需要的话,[可以点击这里领取](https://github.com/a120464/Android-P7/blob/master/Android%E5%BC%80%E5%8F%91%E4%B8%8D%E4%BC%9A%E8%BF%99%E4%BA%9B%EF%BC%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)

标签:面试题,Java,2021Android,对象,广播,内存,架构师,Android,垃圾
来源: https://blog.51cto.com/u_15285973/3006533

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有