文章目录

  • 前言
  • 一、go的内存模型图
  • 1.1 arena
  • 1.2 bitmap
  • 1.3 spans


前言

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

一、go的内存模型图

go项目RES内存一直增大 go 内存_go项目RES内存一直增大

分别介绍下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存放。