簡體   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