垃圾的判断与算法:
引用计数法:
给对象中添加一个引用计数器,每当它被引用到一个地方时,计数器值就+1,;当引用失效时,计数器值就-1;任何时刻计数器为0的对象就是不可能在被使用。
1)、优点
判定效率很高
(2)、缺点
不会完全准确,因为如果出现两个对象相互引用的问题就不行了。
可达性分析法:
该方法的基本思想是通过一系列的“GC Roots”对象(局部变量,栈等)作为起点进行搜索,如果在“GC Roots”和一个对象之间没有可达路径,则称该对象是不可达的,不过要注意的是被判定为不可达的对象不一定就会成为可回收对象;被判定为不可达的对象要成为可回收对象必须至少经历两次标记过程,如果在这两次标记过程中仍然没有逃脱成为可回收对象的可能性,则基本上就真的成为可回收对象了。
可做为GC Roots的对象:
虚拟机栈(帧栈中的本地变量表)中引用的对象。
方法区中静态属性引用的对象。
方法区中常量引用的对象。
本地方法栈中 JNI 引用的对象。
垃圾回收算法:
标记-清除算法:
两个阶段:标记阶段和清除阶段。标记阶段的任务是根据GC ROOTS标记出所有需要被回收的对象,清除阶段就是回收被标记的对象所占用的空间;标记-清除算法实现起来比较容易,但是有一个比较严重的问题就是容易产生内存碎片,碎片太多可能会导致后续过程中需要为大对象分配空间时无法找到足够的空间而提前触发新的一次垃圾收集动作。
标记-复制算法:
它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用的内存空间一次清理掉,这样一来就不容易出现内存碎片的问题。
标记-整理算法:
应用在老年代。该算法标记阶段和Mark-Sweep一样,但是在完成标记之后,它不是直接清理可回收对象,而是将存活对象都向一端移动,然后清理掉端边界以外的内存。在清理的时候,把所有 存活 对象扎堆到同一个地方,让它们待在一起,这样就没有内存碎片了。
本文深入解析垃圾回收的原理,包括引用计数法、可达性分析法及标记-清除、标记-复制、标记-整理三种垃圾回收算法。阐述了各种算法的工作机制、优缺点及其应用场景。
1833

被折叠的 条评论
为什么被折叠?



