• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

golang map 删除key后内存不会自动释放,内存泄漏问题

武飞扬头像
abka
帮助1

全局map ,会有内存释放问题

  1.  
    package main
  2.  
     
  3.  
    import (
  4.  
    "fmt"
  5.  
    "github.com/thoas/go-funk"
  6.  
    "math"
  7.  
    "runtime"
  8.  
    )
  9.  
     
  10.  
    var m = map[int]int{}
  11.  
     
  12.  
    func fillMap() {
  13.  
    for i := 0; i < 10000000; i {
  14.  
    m[funk.RandomInt(0, math.MaxInt)] = 1
  15.  
    }
  16.  
     
  17.  
    }
  18.  
    func clearMap() {
  19.  
    for k, _ := range m {
  20.  
    delete(m, k)
  21.  
    }
  22.  
    }
  23.  
     
  24.  
    func printAlloc(prefix string) {
  25.  
     
  26.  
    //runtime.KeepAlive(m) // Keeps a reference to m so that the map isn’t collected
  27.  
     
  28.  
    var memStats runtime.MemStats
  29.  
    runtime.ReadMemStats(&memStats)
  30.  
    fmt.Printf("%s %d KB\n", prefix, memStats.Alloc/1024)
  31.  
     
  32.  
    }
  33.  
    func main() {
  34.  
    printAlloc("0 init")
  35.  
     
  36.  
    i := 0
  37.  
    for {
  38.  
    fillMap()
  39.  
    i
  40.  
    printAlloc(fmt.Sprintf("%d after fillMap", i))
  41.  
     
  42.  
    clearMap()
  43.  
    i
  44.  
    printAlloc(fmt.Sprintf("%d after clearMap", i))
  45.  
    runtime.GC()
  46.  
    i
  47.  
    printAlloc(fmt.Sprintf("%d after clearMap and runtime.GC()", i))
  48.  
    }
  49.  
    }
学新通

运行结果:

  1.  
    0 init 122 KB
  2.  
    1 after fillMap 498465 KB
  3.  
    2 after clearMap 498465 KB
  4.  
    3 after clearMap and runtime.GC() 314553 KB
  5.  
    4 after fillMap 332361 KB
  6.  
    5 after clearMap 332361 KB
  7.  
    6 after clearMap and runtime.GC() 328193 KB
  8.  
    7 after fillMap 345168 KB
  9.  
    8 after clearMap 345168 KB
  10.  
    9 after clearMap and runtime.GC() 343024 KB
  11.  
    10 after fillMap 359844 KB
  12.  
    11 after clearMap 359844 KB
  13.  
    12 after clearMap and runtime.GC() 357156 KB
  14.  
    13 after fillMap 374176 KB
  15.  
    14 after clearMap 374176 KB
  16.  
    15 after clearMap and runtime.GC() 370808 KB
  17.  
    16 after fillMap 388154 KB
  18.  
    17 after clearMap 388154 KB
  19.  
    18 after clearMap and runtime.GC() 383938 KB
  20.  
    19 after fillMap 401954 KB
  21.  
    20 after clearMap 401954 KB
  22.  
    21 after clearMap and runtime.GC() 396682 KB
  23.  
    22 after fillMap 407494 KB
  24.  
    23 after clearMap 407494 KB
  25.  
    24 after clearMap and runtime.GC() 407494 KB
  26.  
    25 after fillMap 417683 KB
  27.  
    26 after clearMap 417683 KB
  28.  
    27 after clearMap and runtime.GC() 417683 KB
  29.  
    28 after fillMap 435607 KB
  30.  
    29 after clearMap 435607 KB
  31.  
    30 after clearMap and runtime.GC() 429015 KB
  32.  
    31 after fillMap 438173 KB
  33.  
    32 after clearMap 438173 KB
  34.  
    33 after clearMap and runtime.GC() 438173 KB
  35.  
    34 after fillMap 446853 KB
  36.  
    35 after clearMap 446853 KB
  37.  
    36 after clearMap and runtime.GC() 446853 KB
  38.  
    37 after fillMap 465331 KB
  39.  
    38 after clearMap 465331 KB
  40.  
    39 after clearMap and runtime.GC() 457083 KB
  41.  
    40 after fillMap 464851 KB
  42.  
    41 after clearMap 464851 KB
  43.  
    42 after clearMap and runtime.GC() 464851 KB
  44.  
    43 after fillMap 472132 KB
  45.  
    44 after clearMap 472132 KB
  46.  
    45 after clearMap and runtime.GC() 472132 KB
  47.  
    46 after fillMap 479040 KB
  48.  
    47 after clearMap 479040 KB
  49.  
    48 after clearMap and runtime.GC() 479040 KB
  50.  
    49 after fillMap 485612 KB
  51.  
    50 after clearMap 485612 KB
  52.  
    51 after clearMap and runtime.GC() 485612 KB
  53.  
    52 after fillMap 504711 KB
  54.  
    53 after clearMap 504711 KB
  55.  
    54 after clearMap and runtime.GC() 494399 KB
学新通

如上所示,map的key删除后,还会占用空间,导致map的空间不断增加。

针对map不会重新释放,重新创建新map可以解决,内存释放问题

  1.  
    package main
  2.  
     
  3.  
    import (
  4.  
    "fmt"
  5.  
    "github.com/thoas/go-funk"
  6.  
    "math"
  7.  
    "runtime"
  8.  
    )
  9.  
     
  10.  
    func fillMap(m map[int]int) {
  11.  
    for i := 0; i < 10000000; i {
  12.  
    m[funk.RandomInt(0, math.MaxInt)] = 1
  13.  
    }
  14.  
     
  15.  
    }
  16.  
    func clearMap(m map[int]int) {
  17.  
    for k, _ := range m {
  18.  
    delete(m, k)
  19.  
    }
  20.  
    }
  21.  
     
  22.  
    func printAlloc(prefix string) {
  23.  
     
  24.  
    //runtime.KeepAlive(m) // Keeps a reference to m so that the map isn’t collected
  25.  
     
  26.  
    var memStats runtime.MemStats
  27.  
    runtime.ReadMemStats(&memStats)
  28.  
    fmt.Printf("%s %d KB\n", prefix, memStats.Alloc/1024)
  29.  
     
  30.  
    }
  31.  
    func main() {
  32.  
    printAlloc("0 init")
  33.  
    var m = map[int]int{}
  34.  
    i := 0
  35.  
    for {
  36.  
    if i%100 == 0 {
  37.  
    m = map[int]int{}
  38.  
    i
  39.  
    runtime.GC()
  40.  
    printAlloc(fmt.Sprintf("%d after m = map[int]int{}", i))
  41.  
     
  42.  
    }
  43.  
     
  44.  
    fillMap(m)
  45.  
    i
  46.  
    printAlloc(fmt.Sprintf("%d after fillMap", i))
  47.  
     
  48.  
    clearMap(m)
  49.  
    i
  50.  
    printAlloc(fmt.Sprintf("%d after clearMap", i))
  51.  
    runtime.GC()
  52.  
    i
  53.  
    printAlloc(fmt.Sprintf("%d after clearMap and runtime.GC()", i))
  54.  
    }
  55.  
    }
学新通

输入如下:

  1.  
    0 init 121 KB
  2.  
    1 after m = map[int]int{} 117 KB
  3.  
    2 after fillMap 498515 KB
  4.  
    3 after clearMap 498515 KB
  5.  
    4 after clearMap and runtime.GC() 314553 KB
  6.  
    5 after fillMap 332244 KB
  7.  
    6 after clearMap 332244 KB
  8.  
    7 after clearMap and runtime.GC() 328076 KB
  9.  
    8 after fillMap 345079 KB
  10.  
    9 after clearMap 345079 KB
  11.  
    10 after clearMap and runtime.GC() 342934 KB
  12.  
    11 after fillMap 359783 KB
  13.  
    12 after clearMap 359783 KB
  14.  
    13 after clearMap and runtime.GC() 357095 KB
  15.  
    14 after fillMap 374098 KB
  16.  
    15 after clearMap 374098 KB
  17.  
    16 after clearMap and runtime.GC() 370730 KB
  18.  
    17 after fillMap 388076 KB
  19.  
    18 after clearMap 388076 KB
  20.  
    19 after clearMap and runtime.GC() 383860 KB
  21.  
    20 after fillMap 401836 KB
  22.  
    21 after clearMap 401836 KB
  23.  
    22 after clearMap and runtime.GC() 396564 KB
  24.  
    23 after fillMap 407414 KB
  25.  
    24 after clearMap 407414 KB
  26.  
    25 after clearMap and runtime.GC() 407414 KB
  27.  
    26 after fillMap 417595 KB
  28.  
    27 after clearMap 417595 KB
  29.  
    28 after clearMap and runtime.GC() 417595 KB
  30.  
    29 after fillMap 435503 KB
  31.  
    30 after clearMap 435504 KB
  32.  
    31 after clearMap and runtime.GC() 428911 KB
  33.  
    32 after fillMap 438066 KB
  34.  
    33 after clearMap 438066 KB
  35.  
    34 after clearMap and runtime.GC() 438066 KB
  36.  
    35 after fillMap 446692 KB
  37.  
    36 after clearMap 446692 KB
  38.  
    37 after clearMap and runtime.GC() 446692 KB
  39.  
    38 after fillMap 465169 KB
  40.  
    39 after clearMap 465169 KB
  41.  
    40 after clearMap and runtime.GC() 456920 KB
  42.  
    41 after fillMap 464680 KB
  43.  
    42 after clearMap 464680 KB
  44.  
    43 after clearMap and runtime.GC() 464680 KB
  45.  
    44 after fillMap 472034 KB
  46.  
    45 after clearMap 472034 KB
  47.  
    46 after clearMap and runtime.GC() 472034 KB
  48.  
    47 after fillMap 478964 KB
  49.  
    48 after clearMap 478964 KB
  50.  
    49 after clearMap and runtime.GC() 478964 KB
  51.  
    50 after fillMap 485536 KB
  52.  
    51 after clearMap 485536 KB
  53.  
    52 after clearMap and runtime.GC() 485537 KB
  54.  
    53 after fillMap 504625 KB
  55.  
    54 after clearMap 504625 KB
  56.  
    55 after clearMap and runtime.GC() 494313 KB
  57.  
    56 after fillMap 500154 KB
  58.  
    57 after clearMap 500154 KB
  59.  
    58 after clearMap and runtime.GC() 500155 KB
  60.  
    59 after fillMap 505737 KB
  61.  
    60 after clearMap 505737 KB
  62.  
    61 after clearMap and runtime.GC() 505737 KB
  63.  
    62 after fillMap 510983 KB
  64.  
    63 after clearMap 510983 KB
  65.  
    64 after clearMap and runtime.GC() 510983 KB
  66.  
    65 after fillMap 515936 KB
  67.  
    66 after clearMap 515937 KB
  68.  
    67 after clearMap and runtime.GC() 515936 KB
  69.  
    68 after fillMap 520646 KB
  70.  
    69 after clearMap 520646 KB
  71.  
    70 after clearMap and runtime.GC() 520646 KB
  72.  
    71 after fillMap 525081 KB
  73.  
    72 after clearMap 525081 KB
  74.  
    73 after clearMap and runtime.GC() 525081 KB
  75.  
    74 after fillMap 529315 KB
  76.  
    75 after clearMap 529315 KB
  77.  
    76 after clearMap and runtime.GC() 529315 KB
  78.  
    77 after fillMap 533324 KB
  79.  
    78 after clearMap 533324 KB
  80.  
    79 after clearMap and runtime.GC() 533323 KB
  81.  
    80 after fillMap 537098 KB
  82.  
    81 after clearMap 537098 KB
  83.  
    82 after clearMap and runtime.GC() 537098 KB
  84.  
    83 after fillMap 556805 KB
  85.  
    84 after clearMap 556805 KB
  86.  
    85 after clearMap and runtime.GC() 543909 KB
  87.  
    86 after fillMap 547256 KB
  88.  
    87 after clearMap 547256 KB
  89.  
    88 after clearMap and runtime.GC() 547256 KB
  90.  
    89 after fillMap 550451 KB
  91.  
    90 after clearMap 550451 KB
  92.  
    91 after clearMap and runtime.GC() 550451 KB
  93.  
    92 after fillMap 553470 KB
  94.  
    93 after clearMap 553470 KB
  95.  
    94 after clearMap and runtime.GC() 553470 KB
  96.  
    95 after fillMap 556316 KB
  97.  
    96 after clearMap 556316 KB
  98.  
    97 after clearMap and runtime.GC() 556316 KB
  99.  
    98 after fillMap 558999 KB
  100.  
    99 after clearMap 558999 KB
  101.  
    100 after clearMap and runtime.GC() 558999 KB
  102.  
    101 after m = map[int]int{} 120 KB
  103.  
    102 after fillMap 498491 KB
  104.  
    103 after clearMap 498492 KB
  105.  
    104 after clearMap and runtime.GC() 314557 KB
  106.  
    105 after fillMap 332393 KB
  107.  
    106 after clearMap 332394 KB
  108.  
    107 after clearMap and runtime.GC() 328225 KB
  109.  
    108 after fillMap 345197 KB
  110.  
    109 after clearMap 345197 KB
  111.  
    110 after clearMap and runtime.GC() 343053 KB
  112.  
    111 after fillMap 359880 KB
  113.  
    112 after clearMap 359880 KB
  114.  
    113 after clearMap and runtime.GC() 357192 KB
学新通

重置后,内存恢复120KB:101 after m = map[int]int{} 120 KB

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgfbcbf
系列文章
更多 icon
同类精品
更多 icon
继续加载