Android:GC机制面试题集锦

作者: 像程序那样思考 | 来源:发表于2019-07-25 14:45 被阅读9次

    前言

    很多人面试之前,可能没有在互联网公司工作过或者说工作过但年头较短,不知道互联网公司技术面试都会问哪些问题? 再加上可能自己准备也不充分,去面试没几个回合就被面试官几个问题打蒙了,最后以惨败收场。

    下述是我收录整理的Android面试题汇总,由于篇幅原因,在这只把GC机制部分的题目列举出来,后续还会更新其余面试题内容,大家可以关注一下我,及时知晓我更新的知识点,同时这份面试集锦的整理也花费了我很多时间,有需要的朋友可以帮忙转发分享下,点个赞~

    GC机制

    垃圾收集器一般完成两件事

    1. 检测出垃圾;
    2. 回收垃圾;

    Java对象引用

    通常,Java对象的引用可以分为4类:强引用、软引用、弱引用和虚引用。 强引用:通常可以认为是通过new出来的对象,即使内存不足,GC进行垃圾收集的时候也不会主动回收。

    Object obj = new Object();
    

    软引用:在内存不足的时候,GC进行垃圾收集的时候会被GC回收。

    Object obj = new Object();
    SoftReference<Object> softReference = new SoftReference<>(obj);
    

    弱引用:无论内存是否充足,GC进行垃圾收集的时候都会回收。

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

    虚引用:和弱引用类似,主要区别在于虚引用必须和引用队列一起使用。

    Object obj = new Object();
    ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();
    PhantomReference<Object> phantomReference = new PhantomReference<>(obj, referenceQueue);
    

    引用队列:如果软引用和弱引用被GC回收,JVM就会把这个引用加到引用队列里,如果是虚引用,在回收前就会被加到引用队列里。

    垃圾检测方法:

    引用计数法:给每个对象添加引用计数器,每个地方引用它,计数器就+1,失效时-1。如果两个对象互相引用时,就导致无法回收。 可达性分析算法:以根集对象为起始点进行搜索,如果对象不可达的话就是垃圾对象。根集(Java栈中引用的对象、方法区中常量池中引用的对象、本地方法中引用的对象等。JVM在垃圾回收的时候,会检查堆中所有对象是否被这些根集对象引用,不能够被引用的对象就会被垃圾回收器回收。)

    垃圾回收算法:

    常见的垃圾回收算法有:

    标记-清除

    标记:首先标记所有需要回收的对象,在标记完成之后统计回收所有被标记的对象,它的标记过程即为上面的可达性分析算法。 清除:清除所有被标记的对象 缺点: 效率不足,标记和清除效率都不高 空间问题,标记清除之后会产生大量不连续的内存碎片,导致大对象分配无法找到足够的空间,提前进行垃圾回收。

    复制回收算法 将可用的内存按容量划分为大小相等的2块,每次只用一块,当这一块的内存用完了,就将存活的对象复制到另外一块上面,然后把已使用过的内存空间一次清理掉。

    缺点:

    将内存缩小了原本的一般,代价比较高 大部分对象是“朝生夕灭”的,所以不必按照1:1的比例划分。 现在商业虚拟机采用这种算法回收新生代,但不是按1:1的比例,而是将内存区域划分为eden 空间、from 空间、to 空间 3 个部分。 其中 from 空间和 to 空间可以视为用于复制的两块大小相同、地位相等,且可进行角色互换的空间块。from 和 to 空间也称为 survivor 空间,即幸存者空间,用于存放未被回收的对象。

    在垃圾回收时,eden 空间中的存活对象会被复制到未使用的 survivor 空间中 (假设是 to),正在使用的 survivor 空间 (假设是 from) 中的年轻对象也会被复制到 to 空间中 (大对象,或者老年对象会直接进入老年带,如果 to 空间已满,则对象也会直接进入老年代)。此时,eden 空间和 from 空间中的剩余对象就是垃圾对象,可以直接清空,to 空间则存放此次回收后的存活对象。这种改进的复制算法既保证了空间的连续性,又避免了大量的内存空间浪费。

    标记-整理

    在老年代的对象大都是存活对象,复制算法在对象存活率教高的时候,效率就会变得比较低。根据老年代的特点,有人提出了“标记-压缩算法(Mark-Compact)”

    标记过程与标记-清除的标记一样,但后续不是对可回收对象进行清理,而是让所有的对象都向一端移动,然后直接清理掉端边界以外的内存。

    这种方法既避免了碎片的产生,又不需要两块相同的内存空间,因此,其性价比比较高。

    分带收集算法

    根据对象存活的周期不同将内存划分为几块,一般是把Java堆分为老年代和新生代,这样根据各个年代的特点采用适当的收集算法。

    新生代每次收集都有大量对象死去,只有少量存活,那就选用复制算法,复制的对象数较少就可完成收集。 老年代对象存活率高,使用标记-压缩算法,以提高垃圾回收效率。

    以上就是Android GC机制的面试题目,后续还会更新其余面试题内容,大家可以关注一下我,及时知晓我更新的知识点,同时这份面试集锦的整理也花费了我很多时间,有需要的朋友可以帮忙转发分享下,点个赞~

    Android架构师之路很漫长,一起共勉吧!
    ——————分割线——————
    简书点赞可以有好几种赞,长按点赞按钮就会有选项,大家点赞的时候,麻烦点个超赞~在这里先谢谢您的支持啦!

    相关文章

      网友评论

        本文标题:Android:GC机制面试题集锦

        本文链接:https://www.haomeiwen.com/subject/utdhrctx.html