垃圾回收算法

  垃圾回收器的机制:
  垃圾回收器是一个优先级很低的一个线程,它会在根据一定的机制来去回收那些没有被任何引用指向的对象,并调用其finalize()方法回收其内存。垃圾回收器回收是有自己的规则,我们无法手动去调用。但是可以使用System.gc()方法来通知GC回收垃圾,但是回不回收由它自己的算法决定,当然内存剩余越少gc肯定回收的越频繁的。

  垃圾回收算法:
  1.Mark-Sweep(标记-清除)算法:标记-清除算法分为两个阶段:标记阶段和清除阶段。标记阶段的任务是标记出所有需要被回收的对象,清除阶段就是回收被标记的对象所占用的空间。优点:实现简单,缺点:容易产生内存碎片,碎片太多可能会导致后续过程中需要为大对象分配空间时无法找到足够的空间而提前触发新的一次垃圾收集动作

在这里插入图片描述

标记阶段

垃圾回收算法_第1张图片

清除阶段
  2.Copying(复制)算法:它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用的内存空间一次清理掉,这样一来就不容易出现内存碎片的问题;该算法运行高效且不容易产生内存碎片,但是却对内存空间的使用做出了高昂的代价,因为能够使用的内存缩减到原来的一半。很显然,Copying算法的效率跟存活对象的数目多少有很大的关系,如果存活对象很多,那么Copying算法的效率将会大大降低。

在这里插入图片描述

复制阶段

垃圾回收算法_第2张图片

清除阶段

  3.Mark-Compact(标记-整理)算法(压缩法):该算法标记阶段和Mark-Sweep一样,但是在完成标记之后,它不是直接清理可回收对象,而是将存活对象都向一端移动,然后清理掉端边界以外的内存。
在这里插入图片描述

标记阶段

垃圾回收算法_第3张图片

整理阶段

  4.Generational Collection(分代收集)算法:它的核心思想是根据对象存活的生命周期将内存划分为若干个不同的区域。一般情况下将堆区划分为老年代(Tenured Generation)和新生代(Young Generation),老年代的特点是每次垃圾收集时只有少量对象需要被回收,而新生代的特点是每次垃圾回收时都有大量的对象需要被回收,那么就可以根据不同代的特点采取最适合的收集算法。

你可能感兴趣的:(闫同学的Java学习,java,jvm,内存管理,算法)