当服务器启动时,它占用的内存大约为83MB,我通过top
检查。
当一些连接被接受并做了一些事情时,它占用的内存大约是500MB,然后,我关闭了所有连接并且服务器清除了所有结构,一段时间后,内存减少了一点,大约30MB。内存没有返回到服务器启动时的级别。
当服务器启动时,我查找了堆信息
# 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后,我再次抬起头来
# 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
我不知道为什么它减少这么少。因为我已经清除了保存在服务器中的变量。有人会就我如何找到问题给出一些建议吗?
PS。它不关心goroutine,我检查了它,并且goroutine的数量没有增加。我已经使用了pprof并打开了gcdebug。
答案 0 :(得分:4)
因为它并不完全取决于缩小它自己的记忆力。 Go垃圾收集器偶尔向OS发出请求以释放未使用的内存。操作系统可能决定不释放内存,因为系统有足够的余量,其他一些原因。
如果您真的担心应用程序占用太多内存或泄漏内存,请注意HeapAlloc
值随着时间的推移。确保此值保持在预期范围内。
此外,不要指望debug.FreeOSMemory()
或runtime.GC()
做您期望的事情。