在内存创建对象的同时,会为它创建一个引用记数器,并将引用记数器加1,每次有引用引用到此对象时,记数器就会累计加1,而当其中一个引用销毁时,记数器就会减1,当引用记数器为0时,说明该对象已经是垃圾对象,下次gc时,对象就会被回收了。
弊端: 对象A与对象B互相引用时,这2个对象的引用记数器永远是正数,当这2个对象都没有被其他对象所引用时(对象不可达),会因为它们的引用记数器不为0导致它们不会被gc回收。
2)可达性算法(jdk1.2 +)
也称为根搜索算法。把程序所有的引用关系看做是一张图(有向图),从GC Root节点开始寻找所有的引用节点,当所有的引用节点寻找完毕之后,剩余的节点被认为是没有引用的节点,即不可达的节点,就是垃圾对象。
上图中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)标记-清除算法
从根集合遍历所有的引用,上图中,根集合引用了A,A引用了C,B是不可达的对象引用,在扫描阶段中,B会被标记为垃圾对象,当垃圾回收机制执行时,会直接将B对象置为空,此时内存块中就只剩下A、C对象引用,B就被垃圾回收给回收掉了。 优点:不需要进行对象的移动,仅对不存活的对象进行处理,在存活对象比较多的情况下极为高效。 缺点:由于标记-清除算法会直接回收掉不存活的对象,会造成内在碎片,不利于后续对象的分配
2)复制算法

从根集合开始遍历,上图中,遍历到A时是可达的,就把A复制到另一块空闲的内存中,继续遍历,发现B不可达,直接跳过,往后,发现C可达,就把C同样地复制到这块空闲内存中,等所有复制都处理完时,把原来的内存空间清空,只保留复制后的这块内存空间。 优点:当存活对象比较少时,极为高效,且不会有产生内存碎片。 缺点:需要一块内存作为交换空间来进行对象的移动。
3)标记-整理算法
从根集合开始遍历,通过对整个内存区的扫描,将可回收对象扫描出来,上图中,到了第二阶段,就将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开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。
下面分享的腾讯、头条、阿里、美团、字节跳动等公司2019-2021年的高频面试题全套解析,博主还把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,下面只是以图片的形式给大家展示一部分。
知识不体系?这里还有整理出来的Android进阶学习的思维脑图,给大家参考一个方向。