Go语言GC

我就是我 2023-10-03 10:08 29阅读 0赞

一、GC

  • GC英文全称 garbage collector
  • Go语言GC是相对C/C++语言非常重要的改进
  • 一些常用GC算法

    • 引用计算法.当对象被引用时计算器加一.不被引用计数器减一

      • PHP和Object-C使用
      • 相互引用无法回收
      • 计数增加消耗
    • Mark And Sweep 标记和清除算法.停止程序运行,递归遍历对象,进行标记.标记完成后将所有没有引用的对象进行清除

      • 由于标记需要停止程序(Stop the world),当对象特别多时,标记和清除过程比较耗时(可能几百毫秒),很难接受
  • 三色标记法:是Mark And Sweep的改进版.从逻辑上分为白色区(未搜索),灰色区(正搜索),黑色区(已搜索).灰色区内容是子引用没有进行搜索,黑色区表示子引用存在
  • 分代收集.一般情况都有三代,例如java中新生代,老年代,永久代.当新生代中带有阈值时会把对象放入到老年代,相同道理老年代内容达到阈值会放入到永久代

二、Go语言中的GC

  • Go语言中采用Stop The World方式
  • Golang每个版本基本上都会对GC进行优化,从Golang1.5开始支持并发(concurrent )收集,从1.8版本已经把STW时间优化到了100微妙,通常只需要10微妙以下.且在1.10版本时再次优化减少GC对CPU占用
  • Go语言中GC是自动运行的,在下列情况下会触发GC

    • 当需要申请内存时,发现GC是上次GC两倍时会触发
    • 每2分钟自动运行一次GC
  • GC调优

    • 小对象复用,局部变量尽量少声明,多个小对象可以放入到结构体,方便GC扫描
    • 少用string的”+”
  • 在runtime包下mgc.go中明确的说明了Golang的GC的解释
  1. // Garbage collector (GC).
  2. //
  3. // The GC runs concurrently with mutator threads, is type accurate (aka precise), allows multiple
  4. // GC thread to run in parallel. It is a concurrent mark and sweep that uses a write barrier. It is
  5. // non-generational and non-compacting. Allocation is done using size segregated per P allocation
  6. // areas to minimize fragmentation while eliminating locks in the common case.
  7. //
  8. // The algorithm decomposes into several steps.
  9. // This is a high level description of the algorithm being used. For an overview of GC a good
  10. // place to start is Richard Jones' gchandbook.org.
  11. //
  12. // The algorithm's intellectual heritage includes Dijkstra's on-the-fly algorithm, see
  13. // Edsger W. Dijkstra, Leslie Lamport, A. J. Martin, C. S. Scholten, and E. F. M. Steffens. 1978.
  14. // On-the-fly garbage collection: an exercise in cooperation. Commun. ACM 21, 11 (November 1978),
  15. // 966-975.
  16. // For journal quality proofs that these steps are complete, correct, and terminate see
  17. // Hudson, R., and Moss, J.E.B. Copying Garbage Collection without stopping the world.
  18. // Concurrency and Computation: Practice and Experience 15(3-5), 2003.
  19. //
  20. // 1. GC performs sweep termination.
  21. //
  22. // a. Stop the world. This causes all Ps to reach a GC safe-point.
  23. //
  24. // b. Sweep any unswept spans. There will only be unswept spans if
  25. // this GC cycle was forced before the expected time.
  26. //
  27. // 2. GC performs the "mark 1" sub-phase. In this sub-phase, Ps are
  28. // allowed to locally cache parts of the work queue.
  29. //
  30. // a. Prepare for the mark phase by setting gcphase to _GCmark
  31. // (from _GCoff), enabling the write barrier, enabling mutator
  32. // assists, and enqueueing root mark jobs. No objects may be
  33. // scanned until all Ps have enabled the write barrier, which is
  34. // accomplished using STW.
  35. //
  36. // b. Start the world. From this point, GC work is done by mark
  37. // workers started by the scheduler and by assists performed as
  38. // part of allocation. The write barrier shades both the
  39. // overwritten pointer and the new pointer value for any pointer
  40. // writes (see mbarrier.go for details). Newly allocated objects
  41. // are immediately marked black.
  42. //
  43. // c. GC performs root marking jobs. This includes scanning all
  44. // stacks, shading all globals, and shading any heap pointers in
  45. // off-heap runtime data structures. Scanning a stack stops a
  46. // goroutine, shades any pointers found on its stack, and then
  47. // resumes the goroutine.
  48. //
  49. // d. GC drains the work queue of grey objects, scanning each grey
  50. // object to black and shading all pointers found in the object
  51. // (which in turn may add those pointers to the work queue).
  52. //
  53. // 3. Once the global work queue is empty (but local work queue caches
  54. // may still contain work), GC performs the "mark 2" sub-phase.
  55. //
  56. // a. GC stops all workers, disables local work queue caches,
  57. // flushes each P's local work queue cache to the global work queue
  58. // cache, and reenables workers.
  59. //
  60. // b. GC again drains the work queue, as in 2d above.
  61. //
  62. // 4. Once the work queue is empty, GC performs mark termination.
  63. //
  64. // a. Stop the world.
  65. //
  66. // b. Set gcphase to _GCmarktermination, and disable workers and
  67. // assists.
  68. //
  69. // c. Drain any remaining work from the work queue (typically there
  70. // will be none).
  71. //
  72. // d. Perform other housekeeping like flushing mcaches.
  73. //
  74. // 5. GC performs the sweep phase.
  75. //
  76. // a. Prepare for the sweep phase by setting gcphase to _GCoff,
  77. // setting up sweep state and disabling the write barrier.
  78. //
  79. // b. Start the world. From this point on, newly allocated objects
  80. // are white, and allocating sweeps spans before use if necessary.
  81. //
  82. // c. GC does concurrent sweeping in the background and in response
  83. // to allocation. See description below.
  84. //
  85. // 6. When sufficient allocation has taken place, replay the sequence
  86. // starting with 1 above. See discussion of GC rate below.

发表评论

表情:
评论列表 (有 0 条评论,29人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Go语言 GC优化经验分享

    不想看长篇大论的,这里先给个结论,go的gc还不完善但也不算不靠谱,关键看怎么用,尽量不要创建大量对象,也尽量不要频繁创建对象,这个道理其实在所有带gc的编程语言也都通用。

    相关 Go GC

    Go GC 用 `Go`,你可以很容易地创建出低延时的应用。`Go GC` 似乎比其他语言的运行时要简单得多。对于 `Go 1.10` 版本,它的垃圾收集器是`Concurr

    相关 go笔记-GC

    GO “非分代的、非紧缩、写屏障、并发标记清理” 并发清理: 垃圾回收(清理过程)与用户逻辑并发执行 三色并发标记 : 标记与用户逻辑并发执行 一般常用垃圾回收方法