标记清除GC

编程

  1. 起初所有的对象都是白色
  2. 扫描所有可达对象,将其标记为灰色
  3. 扫描灰色对象,将其引用对象标记为灰色,自身标记为黑色

最后,未被标记的白色对象,就是需要被GC回收的。

比较奇怪,在GC过程中,如果对象本身是一个值类型,而不是指针类型,因为值类型压根不存在被引用的关系,那么GC会回收它吗?

GC回收的是堆上分配的对象,单个对象在堆中的存储包含两部分:

---------------

| head | body |

---------------

因为堆就是一块存储空间,这个里面放了很多对象,它需要通过head中的信息来取对应内存位置的对象。当GC执行之后,内存区间就会变的不连续,比如说这样:

----------------------------------------------------------------

| head | body | | head | body | | head | body |

----------------------------------------------------------------

这些空白的空间,被称为内存碎片,怎么更高效的使用它们呢?简单的方式是在创建对象的时候,遍历整个堆的空闲内存,如果发现某块空闲内存的空间大于或者等于申请的空间,就直接在这个位置创建。

或者跟memcache一样,把内存空间分成固定大小的内存块,虽然有一些坏处,比如说,如果划分的最小空间是2K,那么,即使创建的对象只需要1K,也需要额外浪费1K的空间。但好处是,在垃圾回收后,能更高效的利用碎片空间。

以上是 标记清除GC 的全部内容, 来源链接: utcz.com/z/515299.html

回到顶部