标记清除GC
- 起初所有的对象都是白色
- 扫描所有可达对象,将其标记为灰色
- 扫描灰色对象,将其引用对象标记为灰色,自身标记为黑色
最后,未被标记的白色对象,就是需要被GC
回收的。
比较奇怪,在GC
过程中,如果对象本身是一个值类型,而不是指针类型,因为值类型压根不存在被引用的关系,那么GC
会回收它吗?
GC
回收的是堆上分配的对象,单个对象在堆中的存储包含两部分:
---------------| head | body |
---------------
因为堆就是一块存储空间,这个里面放了很多对象,它需要通过head
中的信息来取对应内存位置的对象。当GC
执行之后,内存区间就会变的不连续,比如说这样:
----------------------------------------------------------------| head | body | | head | body | | head | body |
----------------------------------------------------------------
这些空白的空间,被称为内存碎片,怎么更高效的使用它们呢?简单的方式是在创建对象的时候,遍历整个堆的空闲内存,如果发现某块空闲内存的空间大于或者等于申请的空间,就直接在这个位置创建。
或者跟memcache
一样,把内存空间分成固定大小的内存块,虽然有一些坏处,比如说,如果划分的最小空间是2K
,那么,即使创建的对象只需要1K
,也需要额外浪费1K
的空间。但好处是,在垃圾回收后,能更高效的利用碎片空间。
以上是 标记清除GC 的全部内容, 来源链接: utcz.com/z/515299.html