Skip to content

Commit

Permalink
Merge pull request hantmac#135 from luobangkui/themoonbear/2.3
Browse files Browse the repository at this point in the history
fix错误
  • Loading branch information
hantmac committed Jul 25, 2019
2 parents dee2c6d + 13502f0 commit d1de70d
Showing 1 changed file with 3 additions and 3 deletions.
6 changes: 3 additions & 3 deletions eBook/chapter2/02.3.1.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ go垃圾回收器的操作都是基于**三色算法**,这一章节主要来

###### *如果垃圾回收过程中,一个灰色对象在某些情况变为不可达状态,它在那次垃圾回收中就不会被回收了,但是不是说下次也不会回收!尽管这不是最佳情况,但也没有那么糟*

在这个过程中,运行应用程序被叫做**修改器(mutator)**。mutator去运行一个小的方法叫做**写屏障write barrier,每次堆中的指针被修改写屏障都会去执行。如果堆中对象的指针被修改,就意味着那个对象现在是可触达的,写屏障会把它标记为灰色并把它放到灰色集合中。
在这个过程中,运行应用程序被叫做**修改器(mutator)**。mutator去运行一个小的方法叫做**写屏障(write barrier)**,每次堆中的指针被修改写屏障都会去执行。如果堆中对象的指针被修改,就意味着那个对象现在是可触达的,写屏障会把它标记为灰色并把它放到灰色集合中。

###### *mutator负责保持黑色集合中没有任何元素的指针去指向白色集合中的元素。这是在写屏障方法的帮助下完成的。如果维持这个不变状态失败的话,会毁坏垃圾回收过程,并且很可能会以一种丑陋和非预期的方式破坏你的程序。*

Expand All @@ -26,9 +26,9 @@ go垃圾回收器的操作都是基于**三色算法**,这一章节主要来
![image](https://github.com/hantmac/Mastering_Go_ZH_CN/tree/master/images/chapter2/02.3-1.jpg)


因此,我们有三种不同颜色:黑色、白色和黑色。当算法开始的时候,所有对象标记为白色。随着算法继续进行,白色对象移到了其它两种颜色集合的一种里面。最后留在白色集合里面的对象会在将来某个时间点被清理掉。
因此,我们有三种不同颜色:黑色、白色和灰色。当算法开始的时候,所有对象标记为白色。随着算法继续进行,白色对象移到了其它两种颜色集合的一种里面。最后留在白色集合里面的对象会在将来某个时间点被清理掉。

在前面的图里,你可以看到白色对象E,它是在白色集合里而且可以访问对象F,E不会被任何其它的对象访问到因为没有其它指向E的指针,这使得E成为了垃圾回收的最佳候选人!另外,对象A、B和C是根对象而且总是可达的,因此它们不会被垃圾回收掉。
在前面的图里,你可以看到白色对象E,它是在白色集合里而且可以访问对象F,E不会被任何其它的对象访问到因为没有其它指向E的指针,这使得E成为了垃圾回收的最佳候选对象!另外,对象A、B和C是根对象而且总是可达的,因此它们不会被垃圾回收掉。


接下来,算法会去处理留下的灰色集合元素,这意味着对象A和F会进入到黑色集合里。对象A会进入到黑色集合是因为它是一个根元素,而F会进入黑色集合是因为它没有指向任何其它对象但是是在灰色集合里。在对象A被垃圾回收之后,对象F会变成不可达状态并且会在下一次垃圾回收器的处理循环中被回收掉。
Expand Down

0 comments on commit d1de70d

Please sign in to comment.