GC 垃圾回收

涉及的技术:

  • 标记-清除。第一步,从一些对象出发(这部分通常称之为root),例如线程内的栈,将引用到的对象做标记。此后,通过第二步 清除,遍历堆中所有的数据,将没有引用的对象进行回收。

  • 引用计数。对于每个对象维护一个引用计数,即自身每被引用一次,就+1,引用消失时,则-1。引用计数到0时,则为垃圾。 设定某种规则,例如垃圾数量达到多少比例之后,触发回收。

  • 拷贝。把一个大的堆,把能够触及到的对象拷贝,然后把老的内存全部清理。这样做能够很好的压缩内存,避免碎片。

  • 分代回收。分代回收是基于这样一个观点,新产生的对象总是很容易就被弃用。于是将对象按照年龄进行划分。

各路GC算法解决的问题:

  • CPU缓存命中(如果内存分布太分散,就不能很好的利用CPU的缓存),而CPU缓存访问起来比内存快多了

  • STW。为了保证GC安全,通常都是将所有执行的线程暂停,清理完之后再恢复执行。所以要遍历的对象越多,STW的时间 就越长。

  • 内存碎片。对象不断的被申请和销毁。久而久之就会产生内存碎片。内存碎片影响CPU缓存,影响CPU数据对齐(不对齐的情况下 会产生更多次数的访问)。

  • 吞吐量。要处理的对象/时间。

目前的GC算法都不是单纯的一种,而往往是上面多种的组合。


更多文章
  • 一个Golang gRPC握手错误的坑
  • Golang(Go语言)爬虫框架colly简明教程及源码阅读与分析
  • 选择合适的技术栈
  • Golang的template(模板引擎)简明教程
  • 毕业三年,一路走来
  • 代码的坏味道
  • 消息分帧(字符串设计或协议设计)的两种形式
  • C, Go, Python的错误处理和异常机制杂谈
  • 好的命名是最好的文档
  • 读《系统之美:决策者的系统思考》
  • Linux高分屏支持
  • GCC默认的头文件搜索路径
  • 读《远见-如何规划职业生涯3大阶段》
  • 后端工程师学前端(五): SASS
  • 后端工程师学前端(四): CSS进阶(盒子模型)