碰撞指针(Bump-pointer)

碰撞指针(Bump-pointer)

碰撞指针(Bump-pointer) #

分配新的对象都是在 From 空间中,所以 From 空间也被称为分配空间(Allocation Space),而 To 空间则相应地被称为幸存者空间(Survivor Sapce)。在 JVM 代码中,这两套命名方式都会出现,所以搞清楚这点比较有好处。

最基础的 copy 算法,就是把程序运行的堆分成大小相同的两半,一半称为 From 空间,一半称为 To 空间。当创建新的对象时,都是在 From 空间里进行内存的分配。等 From 空间满了以后,垃圾回收器就会把活跃对象复制到 To 空间,把原来的 From 空间全部清空。然后再把这两个空间交换,也就是说 To 空间变成下一轮的 From 空间,现在的 From 空间变成 To 空间。具体过程如图所示: 可以看到,上图中的 from 空间已经满了,这时候,如果想再创建一个新的对象是无法满足的。此时就会执行 GC 算法将活跃对象都拷贝到新的空间中去。

在 From 空间里,所有的对象都是从头向后紧密排列的,也就是说对象与对象之间是没有空隙的。而所有的可用内存全部在 From 空间的尾部,也就是上图中 top 指针所指向的位置之后。

那么,当我们需要在堆里创建一个新的对象时,就非常容易了,只需要将 top 指针向后移动即可。top 指针始终指向最后分配的对象的末尾。每当新分配一个新对象时,只需要移动一次指针即可,这种分配效率非常高。

如果按这种方式进行新对象的创建,那么对象与对象之间可以保证没有任何空隙,因为后一个对象是顶着前一个对象分配的,所以,这种方式也叫做碰撞指针(Bump-pointer)。

Viewpoint #

From #

20 | Scavenge:基于copy的垃圾回收算法