跳至主要內容

垃圾收集算法

blacklad大约 2 分钟JvmJavaJvm

垃圾收集算法

1 分代收集理论

  1. 弱分代假说: 绝大多数对象都是朝生夕灭的
  2. 强分代假说: 熬过越多次垃圾回收的对象越难以消亡
  3. 跨代引用相对于同代引用仅占少数

1.1 垃圾回收名词

  1. MinorGC/Young GC 新生代垃圾回收
  2. MajorGC/Old GC 老年的回收
  3. Full GC 收集整个java堆

2 垃圾回收算法

2.1 标记清除算法

  1. 标记阶段: 首先标记处需要清除的对象
  2. 清除阶段: 统一回收被标记的对象

2.1.1 缺点

  1. 效率低, 需要大量标记,随对象的增多而变慢
  2. 内存碎片化, 导致大量不连续的内存碎片

2.2 标记复制算法

将内存按照容量划分为大小相等的两块, 每次只使用一块, 当内存用完后, 将存活的对象复制到另外一块上面, 然后将已使用的整个清理掉.分配时不用考虑有空间碎片的情况。

2.2.1 缺点

  1. 将可用内存变为一半
  2. 如果存活对象过多, 对导致大量的复制的开销, 因此只适用于新生代.

在新生代里, 大概有98%的对象会在第一轮收集中被回收. 所以无需按照1:1的比例划分新生代内存空间, 将新生代划分为一块Eden和两个Survivor空间, 按照8:1:1的比例, 每次分配时只使用Eden和其中一块Survior空间, 回收时将存活的对象复制到另外一块Survior空间上. 当Survior不足以容纳时, 可以通过老年代进行分配。

2.3 标记整理算法

  1. 标记所有需要清除的对象
  2. 将仍然存活的对象向内存空间的一端移动, 然后直接清理掉边界以外的内存

解决标记-清除算法的对象分配内存问题,提高吞吐量。

2.3.1 缺点

  1. 在老年代大量对象存活, 需要移动存活对象并修改引用开销较大, 而且在移动的过程中需要暂停用户程序才能进行.
  2. 在对象移动过程中需要暂停用户线程
上次编辑于:
贡献者: blacklad