我有一個分配大量地圖和切片的 Go 程序。通常有很多使用、分配開銷等。我運行它,它加載了大量數據,然后我使用 Web 服務查詢它。在我讓它運行后,當它讀入所有數據并且沒有做任何查詢(即應該是穩定的)時,我看到內存波動。最近有報道稱:5.42 GB、5.01 GB 和 4.3 GB 的實內存。這是一個巨大的波動。我有大約 1.5 億個對象(掛在主哈希表上的切片)。這是很多小物件。我預計會有一點波動(盡管當沒有分配新對象并且主線程阻塞在套接字上時,我永遠不會期望內存會增加)??赡艿慕忉屖谴罅啃》峙涞拈_銷只會乘以任何自然波動一些代碼正在分配對象(雖然我看不到如何)Go GC 正在執行自己的分頁 (?)我正在使用 Mac OS,但不知何故它有問題這種波動量是否正常/預期?
2 回答

RISEBY
TA貢獻1856條經驗 獲得超5個贊
波動可能是由于您的程序正在創建垃圾收集器最終必須收集的垃圾量。波動的頻率將取決于您創建垃圾的數量/頻率以及垃圾收集器收集它的時間。
一個變量是分配給棧還是堆是由編譯器決定的。通??梢詫⒅羔?、映射和切片分配給堆,但這只有在編譯器的轉義分析確定變量轉義時才會發生。分配給堆的任何內容都需要進行垃圾回收。
即使 Go 處理堆棧與堆的細節,盡可能少地創建垃圾也會有很大的好處。您可以閱讀垃圾收集器暫停 10 秒的極端情況。Go 垃圾收集器并不完美,但它正在改進。它改善得越多,你就越不必擔心它。但你至少應該意識到這一點。
您可以運行以下命令來確定編譯器將分配給堆的內容:
go build -gcflags=-m program.go
您可能會對實際分配給堆的內容感到驚訝。例如,即使您在本地使用 bytes.Buffer 它仍然會分配給堆,因為bytes.Buffer.buf 被重新切片。不管這是否應該發生,在某些情況下,您可能認為自己沒有制造任何垃圾,但實際上確實如此。
- 2 回答
- 0 關注
- 308 瀏覽
添加回答
舉報
0/150
提交
取消