内容简介:在Go中,map中存放map,上层map执行delete,子层map占用的内存会释放,无需手动先释放子map内存,再在上层map执行删除。在C++中,如果使用了map包含map的数据结构,当要释放上层map的某一项时,需要手动释放对应的子map占用的内存,而在Go中,垃圾回收让内存管理变得如此简单。结果
结论
在 Go 中,map中存放map,上层map执行delete,子层map占用的内存会释放,无需手动先释放子map内存,再在上层map执行删除。
实验
在C++中,如果使用了map包含map的数据结构,当要释放上层map的某一项时,需要手动释放对应的子map占用的内存,而在Go中,垃圾回收让内存管理变得如此简单。
package main import ( "log" "runtime" ) var lastTotalFreed uint64 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 Just Freed = %v Sys = %v NumGC = %v\n", m.Alloc/1024, m.TotalAlloc/1024, ((m.TotalAlloc-m.Alloc)-lastTotalFreed)/1024, m.Sys/1024, m.NumGC) lastTotalFreed = m.TotalAlloc - m.Alloc }
结果
2018/09/29 20:09:25 Alloc = 65 TotalAlloc = 65 Just Freed = 0 Sys = 1700 NumGC = 0 2018/09/29 20:09:25 Alloc = 387 TotalAlloc = 391 Just Freed = 3 Sys = 3076 NumGC = 1 2018/09/29 20:09:25 8192 2018/09/29 20:09:25 0 2018/09/29 20:09:25 Alloc = 387 TotalAlloc = 392 Just Freed = 1 Sys = 3140 NumGC = 2 2018/09/29 20:09:25 Alloc = 74 TotalAlloc = 394 Just Freed = 314 Sys = 3140 NumGC = 3
package main import ( "log" "runtime" ) var intMapMap map[int]map[int]int var cnt = 1024 var lastTotalFreed uint64 // size of last memory has been freed func main() { // 1 printMemStats() // 2 initMapMap() runtime.GC() printMemStats() // 3 fillMapMap() runtime.GC() printMemStats() // 4 log.Println(len(intMapMap)) for i := 0; i < cnt; i++ { delete(intMapMap, i) } log.Println(len(intMapMap)) runtime.GC() printMemStats() // 5 intMapMap = nil runtime.GC() printMemStats() } func initMapMap() { intMapMap = make(map[int]map[int]int, cnt) for i := 0; i < cnt; i++ { intMapMap[i] = make(map[int]int, cnt) } } func fillMapMap() { for i := 0; i < cnt; i++ { for j := 0; j < cnt; j++ { intMapMap[i][j] = j } } } func printMemStats() { var m runtime.MemStats runtime.ReadMemStats(&m) log.Printf("Alloc = %v TotalAlloc = %v Just Freed = %v Sys = %v NumGC = %v\n", m.Alloc/1024, m.TotalAlloc/1024, ((m.TotalAlloc-m.Alloc)-lastTotalFreed)/1024, m.Sys/1024, m.NumGC) lastTotalFreed = m.TotalAlloc - m.Alloc }
结果
2018/09/29 20:10:27 Alloc = 64 TotalAlloc = 64 Just Freed = 0 Sys = 1700 NumGC = 0 2018/09/29 20:10:27 Alloc = 41154 TotalAlloc = 41157 Just Freed = 3 Sys = 46026 NumGC = 5 2018/09/29 20:10:27 Alloc = 41241 TotalAlloc = 41293 Just Freed = 48 Sys = 47082 NumGC = 6 2018/09/29 20:10:27 1024 2018/09/29 20:10:27 0 2018/09/29 20:10:27 Alloc = 114 TotalAlloc = 41295 Just Freed = 41128 Sys = 47082 NumGC = 7 2018/09/29 20:10:27 Alloc = 74 TotalAlloc = 41296 Just Freed = 41 Sys = 47082 NumGC = 8
参考资料
如果这篇文章对你有帮助,请点个赞/喜欢,让我知道我的写作是有价值的,感谢。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- golang内存释放
- 【缺陷周话】第22期:错误的内存释放对象
- 【缺陷周话】第31期:错误的内存释放方法
- cocoa-touch – 使用dismissModalViewControllerAnimated不会释放任何内存
- sql-server – 如何释放空闲SQL Server数据库使用的内存?
- golang中的定时器由于没有正确释放导致内存和cpu使用率异常
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Python网络编程攻略
萨卡尔 (Dr.M.O.Faruque Sarker) / 安道 / 人民邮电出版社 / 2014-12-1 / 45.00元
开发TCP/IP网络客户端和服务器应用 管理本地设备的IPv4/IPv6网络接口 使用HTTP和HTTPS协议编写用途多、效率高的Web客户端 编写可使用常见电子邮件协议的电子邮件客户端 通过Telnet和SSH连接执行远程系统管理任务 使用Web服务与流行的网站交互 监控并分析重要的常见网络安全漏洞一起来看看 《Python网络编程攻略》 这本书的介绍吧!