关于android:史上最全的Android面试题集锦九

4次阅读

共计 1902 个字符,预计需要花费 5 分钟才能阅读完成。

原文链接:https://blog.csdn.net/xiangzh…

4、GC 机制

垃圾收集器个别实现两件事

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

4.1 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 进阶材料:

https://shimo.im/docs/tXXKHgd…

正文完
 0