4、垃圾收集之垃圾收集算法

1、标记-清除算法

  1. 最基础的收集算法,其他的算法基本都是由此算法改进得来
  2. 效率不高,标记和清除的过程效率都不高
  3. 清除以后会产生大量的不连续的内存碎片

 

2、复制算法

  1. 为了解决标记-清除算法的效率问题而出现的复制算法
  2. 将内存分为两块,一个半区用于放对象,另外一个半区是空的
  3. 垃圾回收时将放置对象的半区中未被标记死亡的对象放到空半区
  4. 这样的好处在于实现简单,运行高效
  5. 缺点是牺牲了通常的内存空间,代价太大

 

3、如今的复制算法

  1. HotSpot虚拟机采用Eden-Survivor分区的方式
  2. 将内存分为Eden空间和两块Survivor空间,大小为8 : 1 : 1
  3. 回收时将Eden空间和一块Survivor空间中还存活的对象复制到另外一个Survivor空间中
  4. 这样作的缘由是由于:98%的新生代都是“朝生夕死”的,因此每次回收的时候能够将存活的对象放到较小的一块区域
  5. 当另外一块Survivor空间没有大小不够时,虚拟机会经过分配担保机制将这些对象划进老年代

4、标记-整理算法

  1. 在老年代中通常都是存活时间比较长的对象,因此不适合使用复制算法进行回收(基本不会“朝生夕死”)
  2. 标记-整理算法会将全部存活的的对象都像一端移动,而后清理掉边界之外的内存

5、分代回收算法

  1. 当前商业虚拟机的垃圾收集都采用分代回收算法
  2. 将内存划分为几块,通常是把java堆分红新生代和老年代,根据各个年龄代的特色,选择不一样的算法进行回收
  3. 新生代通常是“朝生夕死”,因此采用复制算法,高效且不须要很大的空闲内存
  4. 老年代的对象存活率高,因此使用标记-清除算法或者标记-整理算法
相关文章
相关标签/搜索