Golang의 맵 메모리 해제 방법: 먼저 맵의 모든 키를 삭제하고 맵이 차지하는 메모리는 여전히 [사용된 상태]입니다. 그런 다음 맵을 nil로 설정하고 맵이 차지하는 메모리는 [유휴 상태]입니다. ]; 마지막으로 유휴 상태의 메모리는 반드시 운영체제에 다시 적용할 필요 없이 다음 번에 적용 시간을 재사용할 수 있습니다.
Golang의 맵 메모리 해제 방법:
샘플 코드:
go 버전: 1.12.9
package main import ( "log" "runtime" ) var intMap map[int]int var cnt = 8192 func main() { printMemStats() initMap() runtime.GC() printMemStats() log.Println(len(intMap)) for i := 0; i < cnt; i++ { delete(intMap, i) } log.Println(len(intMap)) runtime.GC() printMemStats() intMap = nil runtime.GC() printMemStats() } func initMap() { intMap = make(map[int]int, cnt) for i := 0; i < cnt; i++ { intMap[i] = i } } func printMemStats() { var m runtime.MemStats runtime.ReadMemStats(&m) log.Printf("Alloc = %v TotalAlloc = %v Sys = %v NumGC = %v\n", m.Alloc/1024, m.TotalAlloc/1024, m.Sys/1024, m.NumGC) }
출력 결과:
2019/11/22 15:42:33 Alloc = 138 TotalAlloc = 138 Sys = 68290 NumGC = 0 2019/11/22 15:42:33 Alloc = 456 TotalAlloc = 460 Sys = 68610 NumGC = 1 2019/11/22 15:42:33 8192 2019/11/22 15:42:33 0 2019/11/22 15:42:33 Alloc = 458 TotalAlloc = 464 Sys = 68674 NumGC = 2 2019/11/22 15:42:33 Alloc = 146 TotalAlloc = 466 Sys = 68674 NumGC = 3
필드 설명:
할당
: 현재 힙의 개체가 차지하는 메모리 크기 Alloc
: 当前堆上对象占用的内存大小;
TotalAlloc
:堆上总共分配出的内存大小;
Sys
: 程序从操作系统总共申请的内存大小;
NumGC
TotalAlloc
: 힙에 할당된 총 메모리 크기 Sys
운영 체제에서 시작합니다. 요청된 총 메모리 크기
NumGC
: 가비지 수집 실행 횟수입니다. 실행 결과를 보면 맵의 키를 삭제한 후 차지했던 메모리가 해제되지 않은 것을 알 수 있습니다.🎜🎜결론: 🎜🎜Golang의 맵은 키가 삭제된 직후에 메모리를 해제하지 않으므로 프로그램이 실행됨에 따라 맵이 차지하는 메모리는 실제로 점점 더 커질 것입니다. 또한 GC는 마킹 단계에서 맵의 모든 요소에 액세스하므로 맵이 매우 클 경우 프로그램 성능에 매우 큰 오버헤드가 발생합니다. 그러나 Go 버전 1.5 이후에는 맵의 키와 값에 포인터가 포함되어 있지 않으면 GC는 맵을 무시합니다. 🎜🎜🎜관련 학습 권장사항: 🎜Go 언어 튜토리얼🎜🎜🎜
위 내용은 golang에서 맵 메모리를 해제하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!