谈论Go什么时候会触发GC问题

文章编号:5150 安全相关 2023-10-18

在早期经常遭到唾弃的就是在垃圾回收(下称:GC)机制中STW(Stop-The-World)的时间过长。那么这个时候,我们又会好奇一点,作为STW的起始,Go语言中什么时候才会触发GC呢?

在计算机科学中,垃圾回收(GC)是一种自动管理内存的机制,垃圾回收器会去尝试回收程序不再使用的对象及其占用的内存。

最早JohnMcCarthy在1959年左右发明了垃圾回收,以简化Lisp中的手动内存管理的机制(来自@wikipedia)。

手动管理内存挺麻烦,管错或者管漏内存也很糟糕,将会直接导致程序不稳定(持续泄露)甚至直接崩溃。

GC触发的场景主要分为两大类,分别是: 谈论Go什么时候会触发GC问题

在系统触发的场景中,Go源码的src/runtime/mgc.go文件,明确标识了GC系统触发的三种场景,分别如下:

const(gcTriggerHeapgcTriggerKind=iotagcTriggerTimegcTriggerCycle)

    在手动触发的runtime.GC方法中涉及。

    在手动触发的场景下,Go语言中仅有runtime.GC方法可以触发,也就没什么额外的分类的。

    但我们要思考的是,一般我们在什么业务场景中,要涉及到手动干涉GC,强制触发他呢?

    需要手动强制触发的场景极其少见,可能会是在某些业务方法执行完后,因其占用了过多的内存,需要人为释放。又或是debug程序所需。

    在了解到Go语言会触发GC的场景后,我们进一步看看触发GC的流程代码是怎么样的,我们可以借助手动触发的runtime.GC方法来作为突破口。

    开始新的一轮GC周期,调用gcStart方法触发GC行为,开始扫描标记阶段。

    需要调用gcWaitOnMark方法等待,直到当前GC周期的扫描、标记、标记终止完成。

    需要调用sweepone方法,扫描未扫除的堆跨度,并持续扫除,保证清理完成。在等待扫除完毕前的阻塞时间,会调用Gosched让出。

    在本轮GC已经基本完成后,会调用mPROf_PostSweep方法。以此记录最后一次标记终止时的堆配置文件快照

    看完GC的基本流程后,我们有了一个基本的了解。但可能又有小伙伴有疑惑了?

    实质上在Go运行时(runtime)初始化时,会启动一个goroutine,用于处理GC机制的相关事项。

    funcinit(){goforcegchelper()}funcforcegchelper(){forcegc.g=getg()lockInit(&forcegc.lock,lockRankForcegc)for{lock(&forcegc.lock)ifforcegc.idle!=0{throw("forcegc:phaseerror")}atomic.Store(&forcegc.idle,1)goparkunlock(&forcegc.lock,waitReasonForceGCIdle,traceEvGoBlock,1)//thisgoroutineisexplicitlyresumedbysysmonifdebug.gctrace>0{println("GCforced")}gcStart(gcTrigger{kind:gcTriggerTime,now:nanotime()})}}

    在这段程序中,需要特别关注的是在forcegchelper方法中,会调用goparkunlock方法让该goroutine陷入休眠等待状态,以减少不必要的资源开销。

    在休眠后,会由sysmon这一个系统监控线程来进行监控、唤醒等行为:

    funcsysmon(){...for{...//checkifweneedtoforceaGCift:=(gcTrigger{kind:gcTriggerTime,now:now});t.test()&&atomic.Load(&forcegc.idle)!=0{lock(&forcegc.lock)forcegc.idle=0varlistgListlist.push(forcegc.g)injectglist(&list)unlock(&forcegc.lock)}ifdebug.schedtrace>0&&lasttraceint64(debug.schedtrace)*1000000<=now{lasttrace=nowschedtrace(debug.scheddetail>0)}unlock(&sched.sysmonlock)}}

    这段代码核心的行为就是不断地在for循环中,对gcTriggerTime和now变量进行比较,判断是否达到一定的时间(默认为2分钟)。

    若达到意味着满足条件,会将forcegc.g放到全局队列中接受新的一轮调度,再进行对上面forcegchelper的唤醒。

    在了解定时触发的机制后,另外一个场景就是分配的堆空间的时候,那么我们要看的地方就非常明确了。

    那就是运行时申请堆内存的mallocgc方法。核心代码如下:

    funcmallocgc(sizeuintptr,typ*_type,needzerobool)unsafe.Pointer{shouldhelpgc:=false...ifsize<=maxSmallSize{ifnoscan&&sizeNEXtFree(tinySpanClass)}...spc:=makeSpanClass(sizeclass,noscan)span=c.alloc[spc]v:=nextFreeFast(span)ifv==0{v,span,shouldhelpgc=c.nextFree(spc)}...}}else{shouldhelpgc=truespan=c.allocLarge(size,needzero,noscan)...}ifshouldhelpgc{ift:=(gcTrigger{kind:gcTriggerHeap});t.test(){gcStart(t)}}returnx}

    小对象:如果申请小对象时,发现当前内存空间不存在空闲跨度时,将会需要调用nextFree方法获取新的可用的对象,可能会触发GC行为。

    大对象:如果申请大于32k以上的大对象时,可能会触发GC行为。

    总结在这篇文章中,我们介绍了Go语言触发GC的两大类场景,并分别基于大类中的细分场景进行了一一说明。

    到此这篇关于谈论Go什么时候会触发GC问题的文章就介绍到这了,更多相关什么时候会触发GC?内容请搜索完美下载以前的文章或继续浏览下面的相关文章希望大家以后多多支持完美下载!

    全局中部横幅
    批量域名生成

    批量域名生成器工具是SEO56使用PHP语言所开发的一个随机域名在线生成的工具及自定义域名生成工具,和批量域名生成,提供多种方式的生成方式,可根据您的实际情况进行生成操作

    西藏网站导航大全

    LOL网址导航网是专业的上网导航网站,精心收录各类优质热门网站信息,同时提供天气、快递、违章等各种生活便民查询工具网址,为您提供安全便捷的上网导航服务,现已被众多网友设为上网主页,网址导航大全首选LOL网址导航.

    显微镜

    北京瑞科中仪科技有限公司是一家专业的显微成像整体方案服务类企业,以显微镜为主体为用户提供实验室整体设计方案,助力细胞分析、细胞培养、细胞注射以及岩石玻片分析,电动显微成像全自动扫描系统,包括共聚焦显微成像等等整体方案。

    极光PDF官方网站

    极光PDF是一款强大的多功能PDF编辑软件,采用国产自研PDF引擎,拥有PDF编辑、格式转换、注释、压缩合并、PDF翻译等多种功能,可满足用户不同的需求。百M文件秒开,多种编辑模式和强大的图片编辑功能,让编辑PDF像编辑PPT一样轻松

    业融易创业引擎

    业融易以“我们更体贴创业者!”为品牌主张。山东业融易传媒有限公司积极打造一站式创业服务平台,为创业者提供从创业之初开始的系列化综合服务。打造“有梦想、敢融通、勤奋斗、促成功”的品牌形象,树立依托于互联网的创业创新服务品牌。

    合肥无缝钢管

    合肥文乾物资热线13855178355常年生产和销售各种规格无缝钢管,精密钢管、不锈钢管,合金管等。所售钢管《保证市场价格低》《质量全面跟踪》可供您放心选择!

    成都夹芯板

    金堂荣旺彩钢有限公司是一家主要从事于成都夹芯板,成都钢材,成都彩钢瓦,成都岩棉板销售的公司,咨询电话:18382020988,欢迎新老顾客前来咨询,本公司竭诚为您服务!

    青岛成城工程有限公司

    青岛成城工程有限公司成立于2000年4月,注册资本壹亿贰仟万元人民币。致力于国内外建筑、电力以及化建工程的咨询、管理与施工领域。

    你好乐清

    你好乐清网是乐清地区网上生活互动平台,乐清网友可以在线交流生活运动健康的经验,同时也可以发布各类生活信息,比如各类物品买卖,求租,招聘,工作,汽车,房产,征婚交友,户外活动,二手货物,店面商业信息.

    混凝土双

    献县晨陆路桥仪器厂是一家振动压实成型机,顶击式标准振筛机,混凝土单卧轴搅拌机,混凝土双卧轴搅拌机供应商,产品丰富,欢迎来电洽谈!

    Keep(卡路里科技)

    「Keep」是一款健身App,超过2亿运动爱好者的选择!无论是想减肥塑形或增肌,还是寻找健身跑步瑜伽计步等训练计划,你可以随时随地选择课程进行训练!权威教练视频教学,健身干货自由分享。在这里健身打卡,结识志同道合的运动好友,让运动不再是孤单的坚持!

    全局底部横幅