go java gc_图解Golang的GC垃圾回收算法

虽然Golang的GC自打一开始,就被人所诟病,但是经过这么多年的发展,Golang的GC已经改善了非常多,变得非常优秀了。

以下是Golang GC算法的里程碑:

v1.1 STW

v1.3 Mark STW, Sweep 并行

v1.5 三色标记法

v1.8 hybrid write barrier

经典的GC算法有三种: 引用计数(reference counting) 、 标记-清扫(mark & sweep) 、 复制收集(Copy and Collection) 。

Golang的GC算法主要是基于 标记-清扫(mark and sweep) 算法,并在此基础上做了改进。因此,在此主要介绍一下 标记-清扫(mark and sweep)算法 ,关于 引用计数(reference counting) 和 复制收集(copy and collection) 可自行百度。

标记-清扫(Mark And Sweep)算法

此算法主要有两个主要的步骤:

标记(Mark phase)

清除(Sweep phase)

第一步,找出不可达的对象,然后做上标记。

第二步,回收标记好的对象。

操作非常简单,但是有一点需要额外注意: mark and sweep 算法在执行的时候,需要程序暂停!即 stop the world 。

也就是说,这段时间程序会卡在哪儿。故中文翻译成 卡顿 。

我们来看一下图解:

开始标记,程序暂停。程序和对象的此时关系是这样的:

a88cd4a0a554f723067baf315e3846e0.png

然后开始标记,process找出它所有可达的对象,并做上标记。如下图所示:

1a6fa3925974b458c21e5daba0ad7cd8.png

标记完了之后,然后开始清除未标记的对象:

5b68a9effb2fb5ca365150a71d6ca20c.png

然后 垃圾 清除了,变成了下图这样。

29ceef05cdce940a14a6967b30bf917c.png

最后,停止暂停,让程序继续跑。然后循环重复这个过程,直到 process 生命周期结束。

标记-清扫(Mark And Sweep)算法存在什么问题?

标记-清扫(Mark And Sweep)算法 这种算法虽然非常的简单,但是还存在一些问题:

STW,stop the world;让程序暂停,程序出现卡顿。

标记需要扫描整个heap

清除数据会产生heap碎片

这里面最重要的问题就是:mark-and-sweep 算法会暂停整个整个程序。

Go是如何面对并这个问题的呢?

三色并发标记法

我们先来看看Golang的三色标记法的大体流程。

首先:程序创建的对象都标记为白色。

f67076d05f93d91720d1524365911097.png

gc开始:扫描所有可到达的对象,标记为灰色

cb67c8da24be7cc0f113f983b7461b60.png

从灰色对象中找到其引用对象标记为灰色,把灰色对象本身标记为黑色

290c706c97fe8476fc23c8c2b2df72bc.png

监视对象中的内存修改,并持续上一步的操作,直到灰色标记的对象不存在

033a9261cf9c9b5b1c9d436e095c3f96.png

此时,gc回收白色对象。

c567fcdcd8907709b3abb3a55d73118a.png

最后,将所有黑色对象变为白色,并重复以上所有过程。

73e450bd17ecf7b9a98e82a7568800e1.png

好了,大体的流程就是这样的,让我们回到刚才的问题:Go是如何解决 标记-清除(mark and sweep) 算法中的卡顿(stw,stop the world)问题的呢?

gc和用户逻辑如何并行操作?

标记-清除(mark and sweep)算法的STW(stop the world)操作,就是runtime把所有的线程全部冻结掉,所有的线程全部冻结意味着用户逻辑是暂停的。这样所有的对象都不会被修改了,这时候去扫描是绝对安全的。

Go如何减短这个过程呢?标记-清除(mark and sweep)算法包含两部分逻辑:标记和清除。

我们知道Golang三色标记法中最后只剩下的黑白两种对象,黑色对象是程序恢复后接着使用的对象,如果不碰触黑色对象,只清除白色的对象,肯定不会影响程序逻辑。所以: 清除操作和用户逻辑可以并发。

标记操作和用户逻辑也是并发的,用户逻辑会时常生成对象或者改变对象的引用,那么标记和用户逻辑如何并发呢?

process新生成对象的时候,GC该如何操作呢?不会乱吗?

我们看如下图,在此状态下:process程序又新生成了一个对象,我们设想会变成这样:

35bc560be6cd4fefcd6a82a6af760776.png

但是这样显然是不对的,因为按照三色标记法的步骤,这样新生成的对象A最后会被清除掉,这样会影响程序逻辑。

Golang为了解决这个问题,引入了 写屏障 这个机制。

写屏障:该屏障之前的写操作和之后的写操作相比,先被系统其它组件感知。

通俗的讲:就是在gc跑的过程中,可以监控对象的内存修改,并对对象进行重新标记。(实际上也是超短暂的stw,然后对对象进行标记)

在上述情况中, 新生成的对象,一律都标位灰色!

即下图:

5515639647c55c5d8da5f901aeb0e1af.png

那么,灰色或者黑色对象的引用改为白色对象的时候,Golang是该如何操作的?

看如下图,一个黑色对象引用了曾经标记的白色对象。

7ce802d8e4d378c140c04b284105c3f1.png

这时候,写屏障机制被触发,向GC发送信号,GC重新扫描对象并标位灰色。

b7c30f6ef3070212e1ecf18e97df3baf.png

因此,gc一旦开始,无论是创建对象还是对象的引用改变,都会先变为灰色。

参考文献:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/574649.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java wps linux 安装_ubuntu安装Java开发环境

1. 从sun主页JDK for Linux版本。这里的是jdk-6u6--i586.bin.2. 用root用户登录ubuntu,或是在普通用户下用su命令切换用户。切换到所需的安装目录。类型:cd 例如,要在 /usr/java/ 目录中 安装软件,请键入:cd /usr…

考研复试考java_2019考研复试经验帖:过来人谈5件“小事”

关于复试,决定这你的命运,考生一定要好好把握。关于复试,你做好前期功课,足够了解了吗?下面新东方在线分享一位过来人的经验之谈,给大家最走心的忠告~~▶先来说说复试规则。在复试之前学校会公布学校的复试分数线&…

Hadoop2源码分析-RPC机制初识

1.概述 上一篇博客,讲述Hadoop V2的序列化机制,这为我们学习Hadoop V2的RPC机制奠定了基础。RPC的内容涵盖的信息有点多,包含Hadoop的序列化机制,RPC,代理,NIO等。若对Hadoop序列化不了解的同学&#xff0c…

贪心 BestCoder Round #39 1001 Delete

题目传送门 1 /*2 贪心水题:找出出现次数>1的次数和res,如果要减去的比res小,那么总的不同的数字tot不会少;3 否则再在tot里减去多余的即为答案4 用set容器也可以做,思路一样5 */6 #include &l…

在ubuntu上搭建开发环境9---Ubuntu删除ibus出现的问题及解决

删除 ibus输入法:  sudo apt-get install ibus 我们会遇到下面的问题 Ubuntu 14.04 系统设置很多选项消失。 其实遇到这个问题的一个最主要的原因是之前执行过卸载ibus输入法的操作,所以为了避免这个问题请不要卸载ibus输入法,大家依然可以…

HDU 3951 (博弈) Coin Game

先考虑两种简单的情况: 如果先手能一次把硬币拿完,即 k > n ,那么先手胜如果每次只能拿一个硬币, 即 k 1 ,那么如果有奇数个硬币先手胜,如果有偶数个硬币后手胜。剩下的情况就是先手一次拿不完&#xf…

顺序表的插入与删除java_C++实现顺序表的常用操作(插入删出查找输出)

实现顺序表的插入,删除,查找,输出操作在C语言中经常用到。下面小编给大家整理实现代码,一起看下吧代码如下所示:#includeusing namespace std;#define MAXSIZE 15typedef int DataType;typedef struct{DataType data[M…

Android实例-手机安全卫士(三十六)-根据Service是否开启确定CheckBox选中状态

一、目标 1、根据service是否在后台运行情况来确定CheckBox的选中状态; 2、解决"设置中心"的“开启来电号码显示归属地”功能在退出程序再进入时选中状态消失,在任务管理器中关闭“来显”服务时,功能仍为选中状态 二、代码实现 1、…

HTTP - PUT 上传文件/Shell

今天遇到几个PUT上传的点,但是都没利用起来。一怒之下,在自己本地试了一下。步骤如下: 一、环境: 首先,根据 配置Apache服务器支持向目录PUT文件 更新一下httpd.conf文件,重启所有服务。 二、HTTP - PUT PU…

Pro Android学习笔记(三三):Menu(4):Alternative菜单

什么是Alternative menu(替代菜单) 举个例子,Activity显示一个文本文件。如果用户想对文本文件进行编辑,Activity不提供编辑能力,但可由其他activity或者其他应用提供。我们将相关信息存储在一个intent中,例…

java实现手机开关机_Android 系统重启与关机:Java 代码实现

粘贴一篇关于权限的文章:最近在做个东西,巧合碰到了sharedUserId 的问题,所以收集了一些资料,存存档备份。安装在设备中的每一个apk文件,Android 给每个 APK 进程分配一个单独的用户空间,其 manifest 中的 userid 就是…

java数据类型的站位_Java 数据类型在实际开发中应用

在前边的文章中,我已经介绍了Java核心的容器IO等,现在我来说一下java中的数据类型。在java中,一切东西皆为对象(这句话意思是java中绝大数情况都用对象),极少数不是对象的,也存在与之对应的对象(比如基本数据类型存在与…

java amf3_Java AMF3 反序列化漏洞分析

写在前面的话AMF(Action Message Format)是一种二进制序列化格式,之前主要是Flash应用程序在使用这种格式。近期,Code White发现有多个Java AMF库中存在目前,漏洞相关信息已上报至美国CERT(详情请参考美国CERT VU#307983)概述目前&#xff0c…

php修改js内容,js怎样修改html元素的内容?HTML DOM实现修改内容

js怎样修改html元素的内容?本章就给大家介绍在js中利用HTML DOM是怎样修改html元素内容的。有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。首先我们要了解HTML DOM是什么?HTML DOM的作用是什么?HTML…

java中的删除函数的使用方法,如何用Java删除文件

本文概述有两种删除Java文件的方法:使用File.delete()方法使用File.deleteOnExit()方法Java File.delete()方法在Java中, 我们可以使用File类的File.delete()方法删除文件。 delete()方法删除由抽象路径名表示的文件或目录。如果路径名是目录, 则该目录必须为空才能…

C#开发微信门户及应用(28)--微信“摇一摇·周边”功能的使用和接口的实现

C#开发微信门户及应用(28)--微信“摇一摇周边”功能的使用和接口的实现 原文:C#开发微信门户及应用(28)--微信“摇一摇周边”功能的使用和接口的实现”摇一摇周边“是微信提供的一种新的基于位置的连接方式。用户通过“摇一摇”的“周边”页卡,可以与线下商户进行互…

【计算几何】点在多边形内部

问题描述:已知点P(x,y)和多边形Poly,判断点P(x,y)是否在多边形内部。 基本方法:射线法 以点P为端点,向左方作射线L,由于多边形是有界的,所以射线L的左端一定在多边形外部,考虑沿着L从无究远处开…

Hungary(匈牙利算法)——二分图最大匹配

在复习匈牙利算法的时候,发现这么一篇介绍匈牙利算法的文章,非常通俗易懂,所以就借鉴过来了。 复杂度:邻接矩阵:O(v^3)邻接表:O(V*E) 附上链接:趣…

白盒测试 语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、条件组合覆盖、路径覆盖(转)...

转自:http://wenda.tianya.cn/wenda/thread?tid758a1e447e62b7df&hlja 白盒测试作为测试人员常用的一种测试方法,越来越受到测试工程师的重视。白盒测试并不是简单的按照代码设计用例,而是需要根据不同的测试需求,结合不同的…

matlab getsplitpic,MATLAB_9-模式识别笔记

1,识别单独字符的:思想:picsize[20,10];创建一个矩阵,将两个照片整理成大小一致的。具体就是使用后面的:aimresize(a,picsize);fontsABCDEFGHNVJXSMQ;建立字符串用于匹配输出(就是识别的功能!)下面一个for循…