Go 语言中的map和内存泄漏

2023年 11月 21日 28.4k 0

Map在内存中总是会增长;它不会收缩。因此,如果map导致了一些内存问题,你可以尝试不同的选项,比如强制 Go 重新创建map或使用指针。

在 Go 中使用map时,我们需要了解map增长和收缩的一些重要特性。让我们深入探讨这一点,以防止可能导致内存泄漏的问题。

首先,为了查看这个问题的一个具体例子,让我们设计一个场景,在这个场景中我们将使用以下map:

m := make(map[int][128]byte)

每个 m 的值都是一个包含 128 字节的数组。我们将执行以下操作:

  • 分配一个空的map。
  • 添加 100 万个元素。
  • 删除所有元素,并运行垃圾回收(GC)。

在每个步骤之后,我们希望打印堆的大小(使用一个 printAlloc 实用函数)。这将展示这个示例在内存方面的行为方式:

func main() {
    n := 1_000_000
    m := make(map[int][128]byte)
    printAlloc()

    for i := 0; i < n; i++ { // Adds 1 million elements
        m[i] = [128]byte{}
    }
    printAlloc()

    for i := 0; i < n; i++ { // Deletes 1 million elements
        delete(m, i)
    }

    runtime.GC() // Triggers a manual GC
    printAlloc()
    runtime.KeepAlive(m) // Keeps a reference to m so that the map isn’t collected
}

func printAlloc() {
    var m runtime.MemStats
    runtime.ReadMemStats(&m)
    fmt.Printf("%d KBn", m.Alloc/1024)
}

我们分配一个空的map,添加 100 万个元素,删除 100 万个元素,然后运行垃圾回收。我们还确保使用 runtime.KeepAlive 保持对map的引用,以防止map被收集。让我们运行这个示例:

0 MB

相关文章

如何删除WordPress中的所有评论
检查WordPress服务器磁盘使用情况的7种简便方法(查找大文件和数据)
如何更改WordPress常量FS_METHOD
如何为区块编辑器、Elementor等构建WordPress文章模板
如何彻底地删除WordPress主题及相关内容
如何使用WordPress搭建一个内网

发布评论