首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gc如何处理片内存回收

gc如何处理片内存回收
EN

Stack Overflow用户
提问于 2018-09-01 07:51:09
回答 1查看 396关注 0票数 0
代码语言:javascript
复制
var a = [...]int{1,2,3,4,5,6}
s1 := a[2:4:5]

假设s1超出作用域范围,比a更晚。gc怎么知道如何回收S1的底层数组a的内存?

考虑s1,等级库的运行时表示

代码语言:javascript
复制
type SliceHeader struct {
        Data uintptr
        Len  int
        Cap  int
}

GC甚至不知道一个。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-01 11:12:19

Go使用标记和扫描收集器作为当前的实现。

根据该算法,将有一个根对象,其余为树形结构,在多核机器上运行时,gc将与一个核上的程序一起运行。

gc将遍历树,当某些东西无法到达时,认为它是免费的。

Go对象也有对象的元数据,如本帖子中所述。

节选:

我们需要一些关于对象的信息,因为我们没有头文件。标记位保持在侧面,用于标记和分配。每个单词都有2位与其相关联,以告诉您它是一个标量还是一个指针在这个词内。它还编码了对象中是否有更多的指针,这样我们就可以尽早停止扫描对象。

go的切片(切片头)的原因是结构而不是指向结构的指针,这是russ在此页面的slice部分中记录的。

这是一段节选:

Go最初将片表示为指向结构(片头)的指针,但这样做意味着每个片操作都分配了一个新的内存对象。即使使用快速分配器,这也为垃圾收集器带来了许多不必要的工作,我们发现,与字符串一样,程序避免了切片操作,而更倾向于传递显式索引。删除间接和分配使得切片足够便宜,以避免在大多数情况下传递显式索引。

数组的大小(长度)是其类型的一部分。[1]int[2]int的类型是不同的。

要记住的一件事是,go是面向价值的语言,而不是存储指针,而是存储直接的值。

[3]int,数组是go中的值,所以如果您传递一个数组,它会复制整个数组。[3]int --这是一个值(作为一个整体)。

当一个用户执行a[1]时,您将访问该值的一部分。

SliceHeader数据字段表示认为这是数组的基点,而不是a[0]

据我所知:

当有人请求a[4]时,

代码语言:javascript
复制
a[0]+(sizeof(type)*4)

是计算出来的。

现在,如果您通过片s = a[2:4]访问某个内容,如果一个请求s[1],那么您所请求的是,

代码语言:javascript
复制
a[2]+sizeof(type)*1
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52126085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档