什么是复制算法?它解决什么问题?
为了解决 标记—清除 算法的内存碎片缺陷,复制算法于1963年被提出来。
它将堆内存分为两个区域(例如:from area 和 to area)。这两个空间的大小一样。
GC复制算法利用from区做分配,当from区满了以后,会将存活的对象全部复制到to区,
当复制完成以后会将from区和to区互换,这样GC也就结束了。
这样一来就不容易出现内存碎片的问题
先看下面这图
A是RCRoot,它引用了B D,C没有引用源
如果次用标记清除算法的话
标记阶段:A B D是存活对象
清除阶段:把C当做垃圾,清除掉
这种情况下,就会出现碎片问题,红色位置就是碎片,不能使用。
为了解决碎片问题,设计2个空间
复制算法有什么优缺点
优点:
- 没有碎片化:每次进行复制时都会将活动对象重新集中(压缩),避免了碎片化、
- 吞吐量高:GC复制算法只搜索并复制复活对象,因此能在短时间内完成GC。它消耗的时间与活动对象的数量成正比,而不受堆大小的影响。
缺点:
- 浪费一半的内存,要命