我寫了一個程序,試圖學習Go的GC。我認為最初執行mx變量的區域不應該被回收,但我發現這個區域仍然可以通過指針訪問。我的代碼有問題嗎?func main() { fnc()}type myStruct struct { P int64 P2 int64}//go:noinlinefunc fnc() { mx := &myStruct{100,2} // mx -> 0xc00001c080 my := &myStruct{3,4} // my -> 0xc00001c090 oldmx := uintptr(unsafe.Pointer(mx)) mx = my runtime.GC() debug.FreeOSMemory() oldmxStc := (*myStruct)(unsafe.Pointer(oldmx)) fmt.Println(oldmxStc)}
1 回答

HUX布斯
TA貢獻1876條經驗 獲得超6個贊
為什么GC沒有收集這個塊?
垃圾回收器不會對收集哪些特定的內存塊以及何時收集做出任何承諾。GC的目標實際上非常廣泛,即收集垃圾(無法訪問的內存)。它不一定能使程序的內存占用盡可能小。正如icza所提到的,這樣做的效率非常低下。
如果你想了解一些關于Go垃圾收集器如何工作的詳細信息,我建議你看一些演講或閱讀那些研究過它的人的文章。
這是來自官方Go博客的一個很好的閱讀:https://blog.golang.org/ismmkeynote
垃圾回收器的行為不是由語言本身定義的,在運行時的文檔中只有一些非常模糊的含義。
缺乏此類功能的官方文檔是故意的。維護者想要這個理想的情況:
開發人員:不要擔心GC,只需編寫程序即可
維護者:不斷改進GC以使其盡可能好,以便開發人員不必考慮它。
- 1 回答
- 0 關注
- 67 瀏覽
添加回答
舉報
0/150
提交
取消