GO内存模型

前言

今年找工作发现go语言非常火爆,所以也找个机会学习下go语言。首先学习他的内存模型。发现他不同于JAVA的内存模型。GO是基于操作系统实现的。GO是利用操作系统的虚拟内存的概念,在GO当中,他可以直接在虚拟内存2^64 空间大小分配内存,几乎无限大。
GO比JAVA牛逼的地方在于他处理高并发非常简单,有个关键字go就行。go比java在内存管理上牛逼的地方,在于他减少内存拷贝。在go内存模型上,他没有年轻代和老年代的概念。所有的数据存放在某个span的格子当中。

一、go的内存模型图

在这里插入图片描述

分别介绍下Go内存中spans bitmap arena这三个主要的概念

1.1 arena

这个区域内存相当于java中堆内存。go根据我们存放对象的大小,分成67类span分别存储,比如说我需要存放的一个对象大小为1k,那么go会把这个1k对象放到第一个span的某个空闲的格子当中。如果我需要存放的对象的大小为2k,那么go会把这个2k对象放到第二个span的某个空闲的格子当中。

1.2 bitmap

主要有两个作用,
第一记录某个span的格子是否存在对象如(1011),那么go经过计算知道第二个位置可以在放一个对象
第二记录某个sapn的格子对象是否扫描gc后可以被回收如(1101),那么go经过计算知道第三个位置的对象需要被回收,那么go会把第一步当中1011改成1001,那么第三个位置就可以继续存放新对象了。

1.3 spans

spans作用主要有四个
第一个找到对应span在arena的内存地址。
第二个知道span存放的对象类型,是67种的哪一种。
第三个知道这个span对象对应的bitmap,从而知道span中哪些格子是空可以继续放对象
第四个知道span的下一个span的地址是多少,因为有可能某个span存放不下,这个时候go会继续开辟存放相同格子大小的span存放。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值