go - GC是否处理数组的未指向部分

标签 go garbage-collection

假设我们以这种方式创建了一个 slice :

arr := make([]byte, 0, 10)
arr = append(arr, []byte{1, 1, 1}...)

然后我们要释放 7 个尾字节:

arr = arr[:len(arr)]

我们让 slice 的尾部无法到达。 GC 会在下一次扫描迭代中简单地声明此内存是免费的吗?或者底层数组会发生其他事情(例如 copy(),内 stub 本不会被释放)?

最佳答案

Let's say that we created a slice this way:

arr := make([]byte, 0, 10)
arr = append(arr, []byte{1, 1, 1}...)

And then we want to free 7 tail bytes:

arr = arr[:len(arr)]

你不能; Go GC 不会进行部分释放。这 10 个字节将保持分配状态,直到没有对这 10 个字节的任何部分的引用为止。

例如,释放尾字节,

package main

import "fmt"

func main() {
    arr := make([]byte, 0, 10)
    arr = append(arr, []byte{1, 1, 1}...)

    // free tail bytes:
    fmt.Println(len(arr), cap(arr), &arr[0], arr)
    arr = append(make([]byte, 0, len(arr)), arr...)
    fmt.Println(len(arr), cap(arr), &arr[0], arr)
}

Playground :https://play.golang.org/p/l6cbiBoMf4j

输出:

3 10 0x414020 [1 1 1]
3 3 0x414050 [1 1 1]

The Go Blog: Go Slices: usage and internals

关于go - GC是否处理数组的未指向部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58069237/

相关文章:

go - 如何在登录页面写入用户登录错误

Go 编程语言 - 系统时间

rest - 在 Go 中将路由注册到中心对象

dictionary - 将值插入 map 时出现 panic /错误

java - 当 Activity 在其 AsyncTask 运行时被销毁时,内存中会发生什么?

c# - 同一类的析构函数中的对象实例化和垃圾收集

java - HashMap 和垃圾回收 : do I need to call clear() before variable re-assignment?

go - 如何打印反斜杠?

java - 为什么 Java 使用的内核比我要求的多?

c# - 使用 Dispose() 从 Form 中删除 Control