iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >go:垃圾回收GC触发条件的示例分析
  • 637
分享到

go:垃圾回收GC触发条件的示例分析

2023-06-14 20:06:55 637人浏览 安东尼
摘要

这篇文章将为大家详细讲解有关Go:垃圾回收GC触发条件的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。什么是gogo是golang的简称,golang 是Google开发的一种静态强类型、编译型、

这篇文章将为大家详细讲解有关Go:垃圾回收GC触发条件的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

什么是go

go是golang的简称,golang 是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言,其语法与 C语言相近,但并不包括如枚举、异常处理、继承、泛型、断言、虚函数等功能。

版本: go version go1.13 darwin/amd64

在go源码runtime目录中找到gcTrigger结构体,就能看出大致调用的位置

GC调用方式所在位置代码
定时调用runtime/proc.go:forcegchelper()gcStart(gcTrigger{kind: gcTriggerTime, now: nanotime()})
分配内存时调用runtime/malloc.go:mallocgc()gcTrigger{kind: gcTriggerHeap}
手动调用runtime/mgc.go:GC()gcStart(gcTrigger{kind: gcTriggerCycle, n: n + 1})

调用入口有了,再进入gcStart

func gcStart(trigger gcTrigger) {...省略for trigger.test() && sweepone() != ^uintptr(0) {sweep.nbgsweep++}// PerfORM GC initialization and the sweep termination// transition.seMacquire(&work.startSema)// Re-check transition condition under transition lock.这里做了双重,来判断是否符合GC条件if !trigger.test() {semrelease(&work.startSema)return}...省略}//是否需要触发GCfunc (t gcTrigger) test() bool {if !memstats.enablegc || panicking != 0 || gcphase != _GCoff {return false}switch t.kind {case gcTriggerHeap://gc_trigger是触发标记的堆大小。当heap_live≥gc_trigger时,标记阶段将开始。//这也是必须完成比例扫描的堆大小。//这是在标记终止期间根据下一个循环的触发器的triggerRatio计算的return memstats.heap_live >= memstats.gc_triggercase gcTriggerTime:if gcpercent < 0 {return false}lastgc := int64(atomic.Load64(&memstats.last_gc_nanotime))// forcegcperiod = 默认是2分钟return lastgc != 0 && t.now-lastgc > forcegcperiodcase gcTriggerCycle:// t.n > work.cycles, but accounting for wraparound.return int32(t.n-work.cycles) > 0}return true}

后面的代码就是正常的垃圾回收流程了,这里暂且不表,这里只关心gc的触发场景

关于golang垃圾回收,内存分配时何时会重新进入GC?

这里问题是gc的关键,比如当前用了10M内存,随着程序运行,使用内存不是一个固定的值,在当次GC标记结束后,会更新下一次触发gc的heap大小(gc_trigger),下次GC进入之后会在上述的test()函数中会进行heap大小的比较,如果符合条件就真正进行GC

func gcSetTriggerRatio(nextTriggerRatio)

补充:go的垃圾回收机制(GC)

常用的垃圾回收算法

引用计数(reference counting):如python

标记-清扫(mark & sweep):如golang

复制收集(copy and collection):目前许多商业虚拟机都采用这种垃圾回收算法

Golang 的三色标记法

golang 的垃圾回收(GC)是基于标记清扫算法,这种算法需要进行 STW(stop the world),这个过程就会导致程序是卡顿的,频繁的 GC 会严重影响程序性能. golang 在此基础上进行了改进,通过三色标记清扫法与写屏障来减少 STW 的时间.

三色标记法的流程如下,它将对象通过白、灰、黑进行标记

所有对象最开始都是白色.

从 root 开始找到所有可达对象,标记为灰色,放入待处理队列。

历灰色对象队列,将其引用对象标记为灰色放入待处理队列,自身标记为黑色。

循环步骤3直到灰色队列为空为止,此时所有引用对象都被标记为黑色,所有不可达的对象依然为白色,白色的就是需要进行回收的对象。

三色标记法相对于普通标记清扫,减少了 STW 时间. 这主要得益于标记过程是 “on-the-fly” 的,在标记过程中是不需要 STW 的,它与程序是并发执行的,这就大大缩短了 STW 的时间.

写屏障

当标记和程序是并发执行的,这就会造成一个问题. 在标记过程中,有新的引用产生,可能会导致误清扫. 清扫开始前,标记为黑色的对象引用了一个新申请的对象,它肯定是白色的,而黑色对象不会被再次扫描,那么这个白色对象无法被扫描变成灰色、黑色,它就会最终被清扫,而实际它不应该被清扫. 这就需要用到屏障技术,golang 采用了写屏障,作用就是为了避免这类误清扫问题. 写屏障即在内存写操作前,维护一个约束,从而确保清扫开始前,黑色的对象不能引用白色对象.

GC 触发条件

1> 当前内存分配达到一定比例则触发

2> 2 分钟没有触发过 GC 则触发 GC

3> 手动触发,调用 runtime.GC()

关于“go:垃圾回收GC触发条件的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: go:垃圾回收GC触发条件的示例分析

本文链接: https://www.lsjlt.com/news/274629.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • go:垃圾回收GC触发条件的示例分析
    这篇文章将为大家详细讲解有关go:垃圾回收GC触发条件的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。什么是gogo是golang的简称,golang 是Google开发的一种静态强类型、编译型、...
    99+
    2023-06-14
  • Java垃圾回收的示例分析
    这篇文章将为大家详细讲解有关Java垃圾回收的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Java垃圾回收是一项自动化的过程,用来管理程序所使用的运行时内存。通过这一自动化过程,JVM解除了程序...
    99+
    2023-05-30
    java
  • JVM垃圾回收算法的示例分析
    这篇文章主要介绍了JVM垃圾回收算法的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。新一代JVM垃圾回收算法JVM垃圾回收的瓶颈传统分代JVM垃圾回收方式,已经在一定...
    99+
    2023-06-17
  • js中垃圾回收机制的示例分析
    这篇文章主要介绍了js中垃圾回收机制的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。原理找到不再被使用的变量,然后释放其占用的内存,...
    99+
    2024-04-02
  • JVM中垃圾回收机制的示例分析
    这篇文章主要介绍了JVM中垃圾回收机制的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。堆内存的划分分为三个部分(以下名词表示同一个区):新生区、新生代、年轻代养老区、...
    99+
    2023-06-29
  • PHP中垃圾回收机制的示例分析
    小编给大家分享一下PHP中垃圾回收机制的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!如果用过C语言,那么申请内存的方式是malloc或者是calloc,...
    99+
    2023-06-15
  • kubernetes中垃圾回收机制的示例分析
    这篇文章主要介绍了kubernetes中垃圾回收机制的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一:前言Kubernetes系统在长时间运行后,Kubernete...
    99+
    2023-06-04
  • jvm垃圾回收GC调优基础原理分析
    目录核心概念(Core Concepts)Latency(延迟)Throughput(吞吐量)Capacity(系统容量)相关示例Tuning for Latency(调优延迟指标)...
    99+
    2024-04-02
  • jvm垃圾回收之GC调优工具分析详解
    进行GC性能调优时, 需要明确了解, 当前的GC行为对系统和用户有多大的影响。有多种监控GC的工具和方法, 本章将逐一介绍常用的工具。 JVM 在程序执行的过程中, 提供了GC行为的...
    99+
    2024-04-02
  • 浏览器中垃圾回收机制的示例分析
    这篇文章将为大家详细讲解有关浏览器中垃圾回收机制的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。浏览器的垃圾回收机制垃圾回收是一种自动的内存管理机制。当计算机上的...
    99+
    2024-04-02
  • python语言开发垃圾回收机制原理的示例分析
    这篇文章主要介绍python语言开发垃圾回收机制原理的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一.什么是垃圾回收机制垃圾回收机制(简称GC), 解释器自带的一种机制它是一种动态存储管理技术,自动释放不再...
    99+
    2023-06-25
  • Python垃圾回收及Linux Fork实例分析
    这篇文章主要介绍了Python垃圾回收及Linux Fork实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python垃圾回收及Linux Fork实例分析文章都会有所收获,下面我们...
    99+
    2023-06-26
  • 分析PHP的垃圾回收机制
    如果用过C语言,那么申请内存的方式是malloc或者是calloc,然后你用完这个内存后,一定不要忘了用free函数去释放掉,这就是传说中手动垃圾回收,一般都是扫地神僧用这种方式。很...
    99+
    2024-04-02
  • Python垃圾邮件的逻辑回归分类示例分析
    这篇文章主要介绍“Python垃圾邮件的逻辑回归分类示例分析”,在日常操作中,相信很多人在Python垃圾邮件的逻辑回归分类示例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python垃圾邮件的逻辑回归...
    99+
    2023-06-21
  • JVM中垃圾收集算法的示例分析
    这篇文章给大家分享的是有关JVM中垃圾收集算法的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、什么是垃圾本文要讲的是垃圾收集算法,那么首先要确定的问题就是什么是垃圾,也就是哪些对象是要被回收的,对此有...
    99+
    2023-06-15
  • js中新生代垃圾回收知识点的示例分析
    这篇文章将为大家详细讲解有关js中新生代垃圾回收知识点的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在进行老生代的标记清除法回收以前,还会有一个新生代的垃圾回收...
    99+
    2024-04-02
  • PHP中垃圾收集机制的示例分析
    这篇文章主要为大家展示了“PHP中垃圾收集机制的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“PHP中垃圾收集机制的示例分析”这篇文章吧。PHP的垃圾收...
    99+
    2024-04-02
  • Linux下垃圾文件的示例分析
    这篇文章主要介绍Linux下垃圾文件的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Linux 计算机安装后,在我们不断的使用过程中,因为添加、删除软件和上网冲浪、调试程序等行为,硬盘中会产生各种各...
    99+
    2023-06-12
  • Java垃圾回收机制的示例详解
    目录一、概述二、对象已死?1.引用计数算法2.可达性分析算法3.四种引用4.生存还是死亡?5.回收方法区三、垃圾收集算法1.分代收集理论2.名词解释3.标记-清除算法4.标记-复制算...
    99+
    2024-04-02
  • php内存管理机制与垃圾回收机制的示例分析
    这篇文章给大家分享的是有关php内存管理机制与垃圾回收机制的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、内存管理机制先看一段代码:<php//内存管理机制var_dump(memory_get...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作