【问题标题】:Why does not the memory decrease in golang ?为什么 golang 中的内存没有减少?
【发布时间】:2014-12-16 04:26:26
【问题描述】:

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

【问题讨论】:

  • 是这样的,但是等了十多个小时,内存还是400多MB,一头雾水,想知道是什么占用了这么多内存。
  • @buzz:这个答案有什么令人困惑的地方?当前无法释放堆栈内存。你用的是go1.4吗?
  • 是的,go1.4。但是我打电话给debug.FreeOSMemory(),时间长了也没有减少
  • @frank.lin 你终于找到关于这个问题的任何线索了吗?

标签: memory go


【解决方案1】:

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

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

另外,不要指望debug.FreeOSMemory()runtime.GC() 会按照您的预期行事。

【讨论】:

    猜你喜欢
    • 2020-07-18
    • 2017-11-06
    • 1970-01-01
    • 2020-10-13
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多