為什麼 Go 在 GC 時 STW 的時間很短?

時間 2021-05-12 03:16:53

1樓:sda1

這個問題的資料很多了,比如另一位答主的回答中給的那張圖,還有這篇文章我很推薦。

但是究其原因,還是要看Golang自己的proposal。非STW階段都不打擾執行,WB(write barrier)開啟的階段稍微損失效能,所以直到STW之前都可以認為系統執行的很快,到了STW就停止執行了。STW 最長的階段就是 Mark Termination,而這一階段中乙個重要的停頓是 Rescan stacks。

根據這個proposal的說法:

Go 1.7 到1.8的進化中採用了這種hybrid write barrier去避免重新掃瞄stacks:

We propose to eliminate stack re-scanning and replace Go's write barrier with a hybrid write barrier that combines a Yuasa-style deletion write barrier [Yuasa '90] with a Dijkstra-style insertion write barrier [Dijkstra '78].

缺點包括會阻止部分編譯器的優化:

the Go compiler currently omits a write barrier if it can statically show that the pointer is nil, but the hybrid barrier requires a write barrier in this case. This may slightly increase binary size.

2樓:Bing

當時分析過1.5版本,一次gc有2處要stw,如下圖:

第一次開啟寫屏障,第二次rescan處理gc過程中產生的記憶體分配。

3樓:dwing

嚴格來說還是有stw的, 只是極其短,通常低於1ms級別的, 就是盡量想辦法讓gc過程分散化, 當然也是利用了go的一些特性而用了些tricks.

總的來說, 確實是犧牲了gc吞吐量換來了極短的stw, 這也是故意這樣設計的:

一是go的主要應用領域不是CPU敏感的, 而是需要高開發效率甚於高效能的C語言替代品, 通常用於重度IO領域;

二是go避免了跟jvm和.net這樣高吞吐量gc的正面競爭, 發揮出不可替代短stw能力.

Go 語言陣列作為引數傳遞時為什麼要用值傳遞?

瀟灑哥和黑大帥 首先明確一點,指標傳遞 引用傳遞 不一定比值傳遞效率高,原因如下 如果存在引用,經過逃逸分析會放在堆上。而如果陣列只是拷貝,經過逃逸分析會放在棧上。棧上分配記憶體比在堆中分配記憶體有更高的效率。棧上分配的記憶體不需要GC處理。堆上分配的記憶體使用完畢會交給GC處理。逃逸分析目的是決定...

為什麼每天清醒的時間只有8,9小時。其餘時間都在睡眠?在吵鬧的以及任何環境下 都能很快睡著 ?

我也很長時間都是這個狀態,總是困倦睡不夠,後來查了一下是甲減,而且拖的時間也比較久了。你如果其他的原因都排除了,就去測個甲狀腺功能看一下吧。 你這多大啊?生活有影響嗎?我假期一直這種狀態,我覺得我是睡多了,然後越來越能睡。最後強迫自己起來改生物鐘,後來就慢慢好了。你可以多運動運動,出去走走玩玩。改變...

為什麼GO語言的效能還不如C

你不能用這麼粗暴的用 for 迴圈來測試效能,然後下論斷,而且你 Golang 和 C 的版本 執行環境都沒有說,Golang 這幾年提公升很大的。最後.題主建立 map 的時候都沒有設定 capacity,建議設定一下再看,go 這樣不設定的話挺影響效能的。 gao xinge 雖說比較語言效能招...