其他分享
首页 > 其他分享> > 2021最新Android知识体系总结,瞬间高大上了!

2021最新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/1625669870785340.jpg) # 网络相关面试题 **1.http 状态码** **2.http 与 https 的区别?https 是如何工作的?** **3.TCP三次握手流程** ![](http://www.icode9.com/i/li/?n=2&i=images/20210707/1625669871527624.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/1625669871779117.jpg) # Android三方库的源码分析 **1.OkHttp** **2.Retrofit** **3.RxJava** **4.Glide** **5.EventBus** ![](http://www.icode9.com/i/li/?n=2&i=images/20210707/1625669872446827.jpg) # 数据结构与算法 **1.手写快排** **2.手写归并排序** **3.手写堆以及堆排序** **4.说一下排序算法的区别(时间复杂度和空间复杂度)** **工作中解决了什么难题,做了什么有成就感的项目(这个问题一定会问到,所以肯定要做准备)** ## 最后 其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。 以上分享[【我的阿里P7移动开发架构师学习笔记】](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)七大模块整套学习资料均免费分享,需要的小伙伴,我已经上传到石墨文档了,大家自取就可以了。白嫖可以,别忘了给我点个关注哈。 当然我也为你们整理好了百度、阿里、腾讯、字节跳动等等互联网超级大厂的历年面试真题集锦。这也是我这些年来养成的习惯,一定要学会把好的东西,归纳整理,然后系统的消化吸收,这样才能极大的提高学习效率和成长进阶。碎片、零散化的东西,我觉得最没有价值的。就好比你给我一张扑克牌,我只会觉得它是一张废纸,但如果你给我一副扑克牌,它便有了它的价值。这和我们收集资料就要收集那些系统化的,是一个道理。 如果你需要,我把他放在GitHub了,无偿分享的。 [【Android架构视频+BATJ面试专题PDF+学习笔记】](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) ![](http://www.icode9.com/i/li/?n=2&i=images/20210707/1625669872895440.jpg) 网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

标签:垃圾,Java,对象,广播,瞬间,2021,Android,内存
来源: https://blog.51cto.com/u_15291405/3006628