您的位置:首页 > 其它

【JVM】垃圾收集算法思想---GC (二)

2016-12-07 20:28 260 查看
     
   JVM在做垃圾回收的时候,会检查堆中的所有对象是否会被这些根集对象引用,不能够被引用的对象就会被垃圾收集器回收。

1.      标记-清除算法(Mark-Sweep)

         分为“标记”和“清楚”两个阶段:标记所有需要回收的对象,完成标记后统计收回被标记的对象。

         缺点:效率问题---标记和清楚的过程比较浪费时间;

         空间问题---标记清除后会产生大量不连续的内存碎片。

 

 

 


 

 

 

2.      复制算法(Copying)

         将可用内存划分为大小相等的两块,每次只使用其中一块,当其中一块内存使用完了,就将还活着的对象复制到另一块上面,然后在把之前的内存一次性清除。然后再把剩余的可用空间进行平均两分。

         优点:提高了效率。

         缺点:在对象存活率较高时执行的复制次数比较多,并且空间浪费很严重(50%)。

 


      (多数商业是虚拟机采用这种收集算法,经研究表明,新生代中的对象98%是朝生夕死---存活周期比较长,所以不需要完全按照1:1的比例进行内存的分割,而是将内存划分为一个Eden空间和两个survivor空间。具体的回收机制是这样:回收时,将Eden和survivor中还存活的对象复制到另一个surivor 中,然后清空Eden和survivor,然后周而复始。其中Hotspot虚拟机默认的Eden和survivor的大小比例是8:1。当survivor内存被占满时,会从Eden中重新分配出一块内存)

 

3.      标记-整理算法(Mark-Compact)

          该算法与标记—清除算法类似,但是在标记后不是进行清除操作,而是进行存活对象的移动操作,既清除掉死掉的对象然后将仍然存活的对象进行整理移动。

 


 

4.      分代收集算法(Generational Collection)

         根据对象的存活周期不同将内存划分几块。例如一般Java堆分为新生代和老年代,其中新生代中的对象存活周期短,老年代中的对象存活周期长,这样针对如此情况,在新生代采用复制算法,在老年代采用标记—清除或者标记—整理来进行内存回收,这样可以很好的节约资源和提高内存。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: