我的程序在啓動時加載了大量數據,然後調用debug.FreeOSMemory(),以便立即返回任何額外的空間。htop和golang之間的差異readmemstats
loadDataIntoMem()
debug.FreeOSMemory()
加載到存儲器中之後,HTOP顯示我的過程
VIRT RES SHR
11.6G 7629M 8000
以下但要runtime.ReadMemStats
呼叫顯示我以下
Alloc 5593336608 5.3G
BuckHashSys 1574016 1.6M
HeapAlloc 5593336610 5.3G
HeapIdle 2607980544 2.5G
HeapInuse 7062446080 6.6G
HeapReleased 2607980544 2.5G
HeapSys 9670426624 9.1G
MCacheInuse 9600 9.4K
MCacheSys 16384 16K
MSpanInuse 106776176 102M
MSpanSys 115785728 111M
OtherSys 25638523 25M
StackInuse 589824 576K
StackSys 589824 576K
Sys 10426738360 9.8G
TotalAlloc 50754542056 48G
- 的Alloc是獲得的量從系統還沒有釋放(這是 居民的記憶吧?)但是有很大的不同二者之間。
- 我依靠HeapIdle來殺死我的程序,即如果HeapIdle超過2 GB,重新啓動 - 在這種情況下它是2.5,即使過了一段時間也不會停止。 Golang在將來分配更多時應該使用堆閒置,從而減少堆閒置權?
- 如果假設1錯了,哪個stat可以準確地告訴我什麼是htop的RES值。
- 我能做些什麼來降低HeapIdle的價值?
這是試圖在去1.4.2,1.5.2和1.6.beta1
我看着[內存減少golang問題](http://stackoverflow.com/questions/27497512/why-does-not-the-memory-decrease-in-golang)但它只是說不依賴於FreeOSMemory或runtime.GC(),我還能做什麼? –
作爲[非常熟練的人](https://en.m.wikipedia.org/wiki/Donald_Knuth)曾經說過:「過早優化是萬惡之源。」](http://c2.com/ CGI /維基?PrematureOptimization)。只需略低於8 Gb的物理內存和低於12 Gb的虛擬內存分配,您不應該打擾太多。提示:「過去分配的內存總和」和「當前使用的」之間存在差異。 –
@JimB爲了更快的訪問,我在內存中存儲了大量數據,並且由於我想避免允許os開始交換頁面,因爲其他進程也使用同一臺服務器,所以我認爲當它進入一個糟糕的狀態時州。順便說一句 - 它返回到操作系統之前多久?它已經有十個小時了,HeapIdle仍然是2.5G。這似乎是永遠不會回到操作系統。 –