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

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

package main

import (
	"fmt"
	"github.com/thoas/go-funk"
	"math"
	"runtime"
)

var m = map[int]int{}

func fillMap() {
	for i := 0; i < 10000000; i++ {
		m[funk.RandomInt(0, math.MaxInt)] = 1
	}

}
func clearMap() {
	for k, _ := range m {
		delete(m, k)
	}
}

func printAlloc(prefix string) {

	//runtime.KeepAlive(m) // Keeps a reference to m so that the map isn’t collected

	var memStats runtime.MemStats
	runtime.ReadMemStats(&memStats)
	fmt.Printf("%s %d KB\n", prefix, memStats.Alloc/1024)

}
func main() {
	printAlloc("0 init")

	i := 0
	for {
		fillMap()
		i++
		printAlloc(fmt.Sprintf("%d after fillMap", i))

		clearMap()
		i++
		printAlloc(fmt.Sprintf("%d after clearMap", i))
		runtime.GC()
		i++
		printAlloc(fmt.Sprintf("%d after clearMap and runtime.GC()", i))
	}
}

运行结果:

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

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

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

package main

import (
	"fmt"
	"github.com/thoas/go-funk"
	"math"
	"runtime"
)

func fillMap(m map[int]int) {
	for i := 0; i < 10000000; i++ {
		m[funk.RandomInt(0, math.MaxInt)] = 1
	}

}
func clearMap(m map[int]int) {
	for k, _ := range m {
		delete(m, k)
	}
}

func printAlloc(prefix string) {

	//runtime.KeepAlive(m) // Keeps a reference to m so that the map isn’t collected

	var memStats runtime.MemStats
	runtime.ReadMemStats(&memStats)
	fmt.Printf("%s %d KB\n", prefix, memStats.Alloc/1024)

}
func main() {
	printAlloc("0 init")
	var m = map[int]int{}
	i := 0
	for {
		if i%100 == 0 {
			m = map[int]int{}
			i++
			runtime.GC()
			printAlloc(fmt.Sprintf("%d after m = map[int]int{}", i))

		}

		fillMap(m)
		i++
		printAlloc(fmt.Sprintf("%d after fillMap", i))

		clearMap(m)
		i++
		printAlloc(fmt.Sprintf("%d after clearMap", i))
		runtime.GC()
		i++
		printAlloc(fmt.Sprintf("%d after clearMap and runtime.GC()", i))
	}
}

输入如下:

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

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

猜你喜欢

转载自blog.csdn.net/asdcls/article/details/127280066