算法原理:与标记清除算法类似,标记整理算法也是通过标记可达的对象,然后清除未标记的对象。不同的是,标记整理算法在回收的同时会进行内存整理的操作,将存活的对象顺序紧凑地排列,从而减少内存碎片的产生。 步骤如下: 1.遍历所有的根对象,将其标记为可达。 2.从根对象出发,递归地遍历所有可达的对象,将其标记为可达。
然而,这种方法容易产生大量的内存碎片,且在老年代中一般不直接使用,因为需要额外的空间进行分配担保。 标记整理法(Mark-Compact)标记整理法结合了以上两种算法。在标记阶段,它与标记清除算法一样;但在后续步骤中,不是直接对可回收对象进行清理,而是让所有存活的对象都向内存空间一端移动,然后直接清理掉边界以外的内存。
标记-整理 算法 , 不能用在 内存操作 活跃的场景中 , 如 : 老年代的垃圾回收 , 使用的是 标记-整理 算法 ;
标记:它的第一个阶段与标记/清除算法是一模一样的,均是遍历GC Roots,然后将存活的对象标记。 整理:移动所有存活的对象,且按照内存地址次序依次排列,然后将末端内存地址以后的内存全部回收。因此,第二阶段才称为整理阶段。 它GC前后的图示与复制算法的图非常相似,只不过没有了活动区间和空闲区间的区别,而过程又与标...
在jvm中有些对象是用完就不需要的(业务对象),有些对象则是长久存留的(如Spring的一些组件),所以我们不可能按照同样的收集方式去处理这些对象,所以jvm就会把这些对象进行区分,将存活不久的对象放在新生代,长期存活的放在老年代,然后分别对新生代和老年代采用不同的收集算法,所以这个就叫分代收集。
三、标记-整理(Mark-Compact)算法 复制算法在对象存活率较高时就要进行较多的复制操作,效率将会降低。更关键的是,如果不想浪费50%的空间,就需要有额外的空间进行分配担保(例如,在HotSpot虚拟中,如果Survivor空间没有足够空间存放上一次新生代收集下来的存活对象时,这些对象将直接通过分配担保机制进入老年代),以应对被...
老年代使用标记-压缩算法。压缩就是会进行碎片整理,回收之后的内存不存在碎片。 执行过程 第一阶段是标记阶段,和标记-清除算法一样,也就是递归遍历对象,找到可达对象,设置Header里面的信息。 第二阶段是压缩阶段,将所有存活对象压缩到内存的一端,按顺序排放。之后清理剩余的空间。
HotSpot虚拟机里面关注吞吐量的Parallel Scavenge收集器是基于标记整理算法的,而关注延迟的CMS收集器则是基于标记清除算法的。另外还有一种“和稀泥式”解决方案,做法是让虚拟机平时多数时间都采用标记清除算法,暂时容忍内存碎片的存在,直到内存空间的碎片化程度已经大到影响对象分配时,再采用一次标记整理法,前面提到的基于标...
4.对比标记-清除算法与标记-整理算法 为什么单独比较这两种算法呢,因为老年代中既有使用“标记-清除算法”实现的CMS垃圾收集器,也有使用“标记-整理算法”实现的Serial Old、Parallel Old等垃圾收集器,而“标记-复制算法”在典型情况下只用于新生代(G1是例外,这是一种区别于典型垃圾收集器的收集器),所以这里之比较...
标记-整理算法的标记过程与标记-清除算法相同,但后续步骤不是直接清理,而是将所有存活的对象向一端移动,然后直接清理掉这端边界以外的内存。这种算法可以消除内存碎片问题,但需要全程暂停用户应用程序,即STW(Stop-The-World)。移动对象的同时,如果对象被其他对象引用,还需要调整引用的地址。因此,从效率上来说,标记-整...