共计 1902 个字符,预计需要花费 5 分钟才能阅读完成。
原文链接:https://blog.csdn.net/xiangzh…
4、GC 机制
垃圾收集器个别实现两件事
- 检测出垃圾;
- 回收垃圾;
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…