繁体   English   中英

为什么golang的内存不会减少?

[英]Why does not the memory decrease in golang ?

当服务器启动时,它所占用的内存大约是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。

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

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

另外,不要指望debug.FreeOSMemory()runtime.GC()执行您期望的操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM