GC 触发条件:
1> 当前内存分配达到一定比例则触发
2> 2 分钟没有触发过 GC 则触发 GC
3> 手动触发,调用 runtime.GC()
阈值是由一个gcpercent的变量控制的,当新分配的内存占已在使用中的内存的比例超过gcprecent时就会触发。 比如一次回收完毕后,内存的使用量为5M,那么下次回收的时机则是内存分配达到10M的时候。也就是说,并不是内存分配越多,垃圾回收频率越高。 如果一直达不到内存大小的阈值呢?这个时候GC就会被定时时间触发,比如一直达不到10M,那就定时(默认2min触发一次)触发一次GC保证资源的回收。
GO :垃圾回收机制 (GC: Garbage Collection)
阻塞状态是go调度的一个待唤醒的状态,是不能被gc的。
go V1.3之前 采用的gc是标记回收法(mark&sweep):
从根变量来时遍历所有被引用对象,标记之后进行清除操作,对未标记对象进行回收
那么如何从代码方面优化以减少gc导致的STW的时间?
-
减少对象的分配
-
使用sync.Pool
GO V1.5 采用三色标记法:
三色标记最大的好处是可以异步执行,从而可以以中断时间极少的代价或者完全没有中断来进行整个 GC。
三色标记法很简单