怎样做网站的优化,wordpress文章回复,网站建设与维护岗位职责,专注于seo顾问1.垃圾回收的目的 将未被引用到的对象销毁#xff0c;回收其所占的内存空间。
2.根对象是什么 全局变量#xff1a;在编译器就能确定的存在于程序整个生命周期的变量。 执行栈#xff1a;每个goroutine都包含自己的执行栈#xff0c;这些执行栈上包含栈上的变量及指向分配…1.垃圾回收的目的 将未被引用到的对象销毁回收其所占的内存空间。
2.根对象是什么 全局变量在编译器就能确定的存在于程序整个生命周期的变量。 执行栈每个goroutine都包含自己的执行栈这些执行栈上包含栈上的变量及指向分配的堆内存块的地址。 寄存器寄存器的值可能表示一个指针参与计算的这些指针可能指向某些赋值器分配的堆内存区块。
3.GC回收的过程
GO目前采用的是三色标记法可以将垃圾回收分为两个阶段标记阶段和回收阶段
在标记阶段开始的时候会将所有的对象放置到白色队列中、
之后从根对象出发扫描所有被引用到的对象将其放入灰色队列。
然后从灰色队列中取出待扫描的对象将其引用到的对象放入灰色队列并将自身转置到黑色队列中。不断重复这一个步骤直到灰色队列为空。
标记阶段结束的时候所有白色对象即为垃圾是本次GC过程中需要进行回收的。
不过三色标记法存在缺点需要在标记阶段停止所有的goroutine,这也就是我们常说的STW。如果用户程序和GC标记并发执行用户程序可能在标记执行的过程中修改对象的指针导致将本该死亡的对象标记为存活和本该存活的对象标记为死亡。
为了解决这个问题go v1.8之后使用混合写屏障技术来支持并发执行。但是仍然会导致程序暂停不过暂停的的时间缩短至0.5ms以内。
开启写屏障后指针发生传递和新分配的内存都会进行标记本轮GC不会回收下次GC时在确定。虽然写屏障不能完全消除STW,但是可以大大缩短STW的时间。
4.GC触发时机 内存分配量达到阈值会触发GC 阈值 上次GC内存分配量 * 内存增长额 在go中的内存增加额由环境变量GOGC控制默认为100即内存增长一倍时触发GC 在堆上创建大于32KB对象的时候会检测此时是否满足垃圾回收的条件如果满足则直接进行垃圾回收 定时触发GC 默认二分钟开启一次 主动触发 程序代码中可以通过runtime.GC()方法主动触发GC
5.GC性能优化 减少对象分配的个数采用复用对象或使用大对象组合多个小对象 在程序开发过程中尽可能减少内存逃逸现象的发生