GC обрабатывает неопознанные части массивов - PullRequest
0 голосов
/ 23 сентября 2019

Допустим, мы создали срез следующим образом:

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

И затем мы хотим освободить 7 хвостовых байтов:

arr = arr[:len(arr)]

Мы оставляем хвост среза недоступным.Будет ли GC просто требовать освобождения этой памяти на следующей итерации?Или что-то еще произойдет с базовым массивом (например, copy(), память вообще не будет освобождена)?

1 Ответ

0 голосов
/ 24 сентября 2019

Скажем, мы создали срез следующим образом:

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

И затем мы хотим освободить 7 хвостовых байтов:

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)
}

Детская площадка: https://play.golang.org/p/l6cbiBoMf4j

Вывод:

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

Блог Go: Go Slices: использование и внутренние компоненты

...