>백엔드 개발 >Golang >Go에서 지도 항목을 삭제하면 메모리 누수가 발생할 수 있나요?

Go에서 지도 항목을 삭제하면 메모리 누수가 발생할 수 있나요?

Patricia Arquette
Patricia Arquette원래의
2024-10-24 05:23:30670검색

Can Deleting a Map Entry Lead to Memory Leaks in Go?

Go에서 지도 항목을 삭제하면 메모리 누수가 발생할 수 있나요?

Go에서 데이터 구조를 조작할 때 일반적으로 우려되는 점은 메모리 누수 가능성입니다. 이 질문은 포인터 맵에서 항목을 삭제하면 이러한 누출이 발생할 수 있는지 여부에 중점을 둡니다.

소스 조사

문서에서는 이 문제를 명시적으로 다루지 않지만 Go 런타임 소스를 검사합니다. 코드는 맵에서 항목이 삭제되면 키와 값 저장소가 모두 지워지는(제로화) 것을 보여줍니다. 이는 안에 포함된 모든 포인터도 지워진다는 것을 의미합니다.

// Clear key storage.
memclr(k, uintptr(t.keysize))
// Clear value storage.
v := unsafe.Pointer(uintptr(unsafe.Pointer(b)) + dataOffset + bucketCnt*uintptr(t.keysize) + i*uintptr(t.valuesize))
memclr(v, uintptr(t.valuesize))

예로 증명

이를 확증하기 위해 포인터 맵이 있는 샘플 프로그램을 만들고 종료자를 등록할 수 있습니다. 포인터에 도달할 수 없을 때 잡기:

import (
    "fmt"
    "runtime"
    "sync"
    "time"
)

type point struct {
    X, Y int
}

func main() {
    // Create a map and put a pointer value in it, with a finalizer.
    m := map[int]*point{}
    p := &point{1, 2}
    runtime.SetFinalizer(p, func(p *point) {
        fmt.Printf("Finalized: %p %+v\n", p, p)
    })
    m[1] = p
    fmt.Printf("Put in map: %p %+v\n", p, p)

    // Delete the entry from the map.
    delete(m, 1)

    // Force garbage collection.
    runtime.GC()

    // Sleep to ensure the finalizer has a chance to run.
    time.Sleep(time.Second)

    // Print the map to verify the map itself wasn't garbage collected.
    fmt.Println(m)
}

이를 실행하면 다음과 같은 출력이 생성됩니다.

Put in map: 0x1040a128 &{X:1 Y:2}
Finalized: 0x1040a128 &{X:1 Y:2}
map[]

보시다시피 포인터가 지도에서 제거되면 종료자가 호출됩니다. 도달할 수 없게 되어 메모리 누수가 없음을 보여줍니다.

위 내용은 Go에서 지도 항목을 삭제하면 메모리 누수가 발생할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.