Android 中高级面试原理:热修复与插件化基础—Java与Android虚拟机

阅读 56

2022-03-20

在内存创建对象的同时,会为它创建一个引用记数器,并将引用记数器加1,每次有引用引用到此对象时,记数器就会累计加1,而当其中一个引用销毁时,记数器就会减1,当引用记数器为0时,说明该对象已经是垃圾对象,下次gc时,对象就会被回收了。

弊端: 对象A与对象B互相引用时,这2个对象的引用记数器永远是正数,当这2个对象都没有被其他对象所引用时(对象不可达),会因为它们的引用记数器不为0导致它们不会被gc回收。

2)可达性算法(jdk1.2 +)

也称为根搜索算法。把程序所有的引用关系看做是一张图(有向图),从GC Root节点开始寻找所有的引用节点,当所有的引用节点寻找完毕之后,剩余的节点被认为是没有引用的节点,即不可达的节点,就是垃圾对象。

Android 中高级面试原理:热修复与插件化基础—Java与Android虚拟机

上图中ObjD、E、F因为没有路径可达,所以是垃圾对象。

2、引用的类型

java中的引用类型有4种:强引用、软引用、弱引用、虚引用。其中,强引用和弱引用在开发中最常用。

弱引用的创建

// 强引用

Object obj = new Object();

// 弱引用,此时obj与wf都引用了Object对象

WeakReference<Object> wf = new WeakReference<Object>(obj);

// 断开强引用,此时只有wf引用这个Object对象

obj = null;

// 通用弱引用获取Object对象(可能为null)

wf.get();

在使用wf.get()时,要判断获取到的对象是否为null,因为弱引用不会阻止对象的回收。

3、垃圾回收算法

1)标记-清除算法

Android 中高级面试原理:热修复与插件化基础—Java与Android虚拟机

从根集合遍历所有的引用,上图中,根集合引用了A,A引用了C,B是不可达的对象引用,在扫描阶段中,B会被标记为垃圾对象,当垃圾回收机制执行时,会直接将B对象置为空,此时内存块中就只剩下A、C对象引用,B就被垃圾回收给回收掉了。 优点:不需要进行对象的移动,仅对不存活的对象进行处理,在存活对象比较多的情况下极为高效。 缺点:由于标记-清除算法会直接回收掉不存活的对象,会造成内在碎片,不利于后续对象的分配

2)复制算法

![](ht

Android 中高级面试原理:热修复与插件化基础—Java与Android虚拟机

tps://img-blog.csdnimg.cn/img_convert/0ba06b4c862dbcee0f9caa412903823e.png)

从根集合开始遍历,上图中,遍历到A时是可达的,就把A复制到另一块空闲的内存中,继续遍历,发现B不可达,直接跳过,往后,发现C可达,就把C同样地复制到这块空闲内存中,等所有复制都处理完时,把原来的内存空间清空,只保留复制后的这块内存空间。 优点:当存活对象比较少时,极为高效,且不会有产生内存碎片。 缺点:需要一块内存作为交换空间来进行对象的移动。

3)标记-整理算法

Android 中高级面试原理:热修复与插件化基础—Java与Android虚拟机

从根集合开始遍历,通过对整个内存区的扫描,将可回收对象扫描出来,上图中,到了第二阶段,就将B标记为可回收对象,到了第三个阶段,直接扫描并消除内存中被标记的对象,同时,在回收不存活对象占用的空间时,会将内存中所有存活对象往左端空闲处移动,并更新对应的指针。

这三种算法各有优劣,JVM在处理垃圾时会整合去使用,并不是只使用其中某个算法。当内存中存活的对象比较少时,采用“复制算法”去处理垃圾对象;当内存中存活的对象比较多时,会采用“标记-整理算法”或“标记-清除算法”去处理垃圾对象。

4、触发回收

  • Java虚拟机无法再为新对象分配内存空间了

  • 手动调用System.gc()方法(强烈不推荐,不会马上执行,却会加大虚拟机压力)

  • 低优先级的GC线程,被启动了。

二、Android 虚拟机

=============

1、Dalvik VM 与 JVM 的不同

  • 执行的文件不同,一个是class,一个是dex。

  • 类加载的系统与JVM区别较大。

  • 可以同时存在多个DVM,但JVM只能存在一个。

  • Dalvik是基于寄存器的,而JVM是基于栈的。

2、Dalvik VM 与 ART 的不同

  • DVM使用JIT来将字节码转换成机器码,效率低。

  • ART采用了AOT预编译技术,执行速度更快。

  • ART会占用更多的应用安装时间和存储空间。

最后

最后对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!

这里附上上述的技术体系图相关的几十套腾讯、头条、阿里、美团等公司19年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

相信它会给大家带来很多收获:

Android 中高级面试原理:热修复与插件化基础—Java与Android虚拟机

最后

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

下面分享的腾讯、头条、阿里、美团、字节跳动等公司2019-2021年的高频面试题全套解析,博主还把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,下面只是以图片的形式给大家展示一部分。

image

知识不体系?这里还有整理出来的Android进阶学习的思维脑图,给大家参考一个方向。

image

精彩评论(0)

0 0 举报