如果我们不想手动重启服务来清理map消耗的内存量,有哪些解决方案?一种解决方案可以是定期重新创建当前map的副本 。例如,每小时我们可以构建一个新map , 复制所有元素,并释放先前的map 。这种选择的主要缺点是,在复制后直到下一次垃圾回收之前,我们可能会在短时间内消耗两倍于当前内存 。
另一种解决方案是将map类型更改为存储数组指针:map[int]*[128]byte 。这并没有解决我们会有大量存储桶的问题;然而,每个存储桶条目将为值保留指针的大?。??皇?28字节(64位系统上为8字节,32位系统上为4字节) 。
回到原始场景,让我们比较每种map类型在每个步骤后的内存消耗 。以下表格显示了比较 。
map[int][128]byte
map[int]*[128]byte
分配一个空的 map
0 MB
0 MB
添加100万个元素
461 MB
182 MB
删除所有元素并运行GC
293 MB
38 MB
正如我们所看到的,在删除所有元素后,使用 map[int]*[128]byte 类型所需的内存量明显较少 。此外 , 在这种情况下,由于一些优化措施以减少内存消耗 , 高峰时期所需的内存量也较少显著 。
注意:如果键或值超过128字节,Go 将不会直接将其存储在map存储桶中 。相反,Go 将存储用于引用键或值的指针 。
结论正如我们所见,向map添加 n 个元素,然后删除所有元素意味着在内存中保持相同数量的存储桶 。因此 , 我们必须记住,由于 Go map只能增长,因此其内存消耗也会随之增加 。它没有自动化的策略来缩小 。如果这导致内存消耗过高,我们可以尝试不同的选项,比如强制 Go 重新创建map或使用指针来检查是否可以进行优化 。
推荐阅读
- C语言代码:数字雨
- C++ STL之std::map:红黑树的魔法与性能测试
- Linux 黑话解释:Linux 中的 Super 键是什么?
- 一文了解低级和高级编程语言
- 雎鸠怎么读,关雎中的雎鸠意象分析?
- 吴千语当众说男友丑,且在上海租房住,林峰口中的PUA是真的吗?
- 日历中的甘一是什么意思 甘在日历中是什么意思
- 淘宝店铺中的订单被淘宝关闭是什么意思 什么是订单被淘宝关闭
- 四书五经指的是什么,四书五经中的四书是指什么
- cdr中的剪切蒙版要如何进行使用