关于go:为什么golang的内存没有减少?

Why does not the memory decrease in golang ?

当服务器启动时,它占用的内存大约是83MB,我检查了top。当一些连接被接受并做了一些事情时,它占用的内存大约是500MB,然后,我关闭了所有的连接,服务器清除了所有的结构,过了一段时间,内存减少了一点,大约30MB。当服务器启动时,内存没有恢复到这个水平。

服务器启动时,我查找堆信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# runtime.MemStats
# Alloc = 7251528
# TotalAlloc = 52713992
# Sys = 15010040
# Lookups = 49
# Mallocs = 2072338
# Frees = 2038576
# HeapAlloc = 7251528
# HeapSys = 12025856
# HeapIdle = 2121728
# HeapInuse = 9904128
# HeapReleased = 0
# HeapObjects = 33762
# Stack = 425984 / 425984
# MSpan = 75504 / 81920
# MCache = 4800 / 16384
# BuckHashSys = 1457768
# NextGC = 11496656

当所有连接都关闭后,经过一段时间和GC,我再次查找

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# runtime.MemStats
# Alloc = 5845912
# TotalAlloc = 13053679584
# Sys = 73128248
# Lookups = 794
# Mallocs = 22728491
# Frees = 22699056
# HeapAlloc = 5845912
# HeapSys = 60112896
# HeapIdle = 52166656
# HeapInuse = 7946240
# HeapReleased = 0
# HeapObjects = 29435
# Stack = 3719168 / 3719168
# MSpan = 88608 / 180224
# MCache = 4800 / 16384
# BuckHashSys = 1597264
# NextGC = 9428528

我不知道为什么它会减少这么少。因为我已经清除了保存在服务器中的变量。有人能给我一些关于如何找到问题的建议吗?

另外,我查过了,它不关心戈罗廷,戈罗廷的数量也没有增加。我已经使用pprof并打开gcdebug。


因为要缩小自己的记忆并不是完全可以的。Go垃圾收集器偶尔向操作系统发出释放未使用内存的请求。操作系统可能决定不释放内存,因为系统有足够的空闲空间,其他一些原因。

如果你真的担心你的应用程序占用了太多的内存或者内存泄漏,那么请注意随着时间的推移HeapAlloc值。确保此值保持在预期范围内。

另外,不要期望debug.FreeOSMemory()runtime.GC()做你所期望的。