谈论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&&size

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

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

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

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


    相关资料:txt下载doc下载文章搜索网址搜索百度搜索、好搜搜索、搜狗搜索必应搜索

    本文链接:http://www.gpxz.com/article/f10fd3e11ae4b48d400d.html


    全局中部横幅
    西贴

    【西贴】集成网上商城历史价格查询,包括京东商城、天猫商城、淘宝、苏宁易购、当当网、新蛋、亚马逊、国美、一号店、库巴及易讯网等价格走势图!

    联系我们果博东方有限公司客服电话19048888882(客服)

    果博东方客服电话19048888882微【19048888882】【果博东方在线客服】【需要办理业务加以上联系方式】【24小时在线】【果博东方客服电话】【果博东方公司直属客服】果博东方公司客服电话-果博东方公司客服联系方式-热线咨询在线-果博东方公司客服中心

    21CN个人邮箱

    21CN免费邮箱--中文电子邮箱著名品牌之一。大容量,免费开通手机号码邮,10G超大空间。支持PC、手机、平板的客户端收发电子邮件。清新界面-高效杀毒-积分有奖活动。

    广西污水处理厂

    桂润环境科技股份有限公司(简称桂润环境)是一家从事环境保护的专业公司,致力于废水、废气噪声、固体废弃物、土壤及生态修复等市政和环保项目的投资、环保工程的设计、施工、安装调试、运营维护等专业服务。

    帝源

    帝源:“致力于人类呼吸安全”,专业于为办公室除甲醛、宠物毛发及异味、二手烟、油烟、消毒、杀菌、放射性气体净化、霉味等领域提供服务!

    永盛智能化网

    智能化是指事物在计算机网络、大数据、物联网和人工智能等技术的支持下,所具有的能满足人的各种需求的属性。比如无人驾驶汽车,就是一种智能化的事物,它将传感器物联网、移动互联网、大数据分析等技术融为一体,从而能动地满足人的出行需求。它之所以是能动的,是因为它不像传统的汽车,需要被动的人为操作驾驶。

    糖尿病足筛查诊断箱,数字振动感觉阈值检查仪,红外治疗仪

    北京澳尔华泰科技有限公司从事研究和生产医疗器械,是一家专门从事糖足医疗设备的高新技术企业。主要产品有:红外治疗仪,数字振动感觉阈值检查仪等神经病变检测设备;公司拥有一支由生产研发、营销策划等专业优秀人才组成的研发团队,技术力量雄厚、经验丰富、生产设备先进,所有产品均符合国家标准.联系电话:010-82899020.

    东莞市德企包装制品有限公司

    东莞市德企包装制品有限公司通过ISO9001-2015体系认证环保14001认证,拥有先进的生产设备、公司产品以优质著称、公司主营PO胶袋、PE胶袋、PP胶袋、OPP胶袋、PPE胶袋、PVC挂勾袋。环保和防静电的工业包装袋,精美印刷、食品袋、制衣厂各种平挂、斜挂袋、信贴袋、单R、双R、航空速递邮包袋、商场各种购物袋、广告袋、自封袋、叉耳袋、手提袋、手挽袋、卡头袋、纸袋、无纺布环保袋。等代客户设计制版、立志为客户提供优质的产品。一流售后服务产品通过SGS检测和符合欧盟REACH、SVHC检测、有检测报告。

    重庆迈鑫铁蓝信息科技有限公司

    重庆迈鑫铁蓝信息科技有限公司www.aboomgo.com经营范围含:礼仪、珠宝、工程监理、制服、盆景、软件设计、磁性材料、四轮定位、化学助剂、安防(依法须经批准的项目,经相关部门批准后方可开展经营活动)。

    进口调节阀

    美国SWEK工业阀门主要产品有闸阀、截止阀、止回阀、调节阀、球阀、蝶阀、仪表阀等;史威阀以优异的品质、合理的性价比,受到用户的普遍欢迎。

    板式换网器

    【介绍】郑州海科熔体泵有限公司,换网器,板式换网器,柱式换网器【项目】☑换网器☑板式换网器☑柱式换网器【电话】0371-67993100

    全局底部横幅