Skip to content

Commit bc1cb5f

Browse files
authored
Merge pull request golang-design#9 from changkun/changkun-gc
Go 语言 GC 20 问
2 parents f59a0ed + ccae6d6 commit bc1cb5f

File tree

16 files changed

+835
-87
lines changed

16 files changed

+835
-87
lines changed

GC/GC.md

Lines changed: 518 additions & 87 deletions
Large diffs are not rendered by default.

GC/assets/gc-leak.png

-234 KB
Binary file not shown.

GC/assets/gc-leak1.png

63.8 KB
Loading

GC/assets/gc-mark-assist.png

502 KB
Loading

GC/assets/gc-mark-sweep.png

478 KB
Loading

GC/assets/gc-mutator.png

-2.14 KB
Loading

GC/assets/gc-trace.png

54.4 KB
Loading

GC/assets/gc-trace2.png

388 KB
Loading

GC/code/10/main.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package main
2+
3+
import (
4+
"os"
5+
"runtime"
6+
"runtime/trace"
7+
"sync/atomic"
8+
)
9+
10+
var stop uint64
11+
12+
func gcfinished() *int {
13+
p := 1
14+
runtime.SetFinalizer(&p, func(_ *int) {
15+
println("gc finished")
16+
atomic.StoreUint64(&stop, 1)
17+
})
18+
return &p
19+
}
20+
21+
func allocate() {
22+
// 每次调用分配 0.25MB,第一次触发 GC 时,此函数被调用了 15 次
23+
_ = make([]byte, int((1<<20)*0.25))
24+
}
25+
26+
func main() {
27+
f, _ := os.Create("trace.out")
28+
defer f.Close()
29+
trace.Start(f)
30+
defer trace.Stop()
31+
gcfinished()
32+
for n := 1; atomic.LoadUint64(&stop) != 1; n++ {
33+
println("#allocate: ", n)
34+
allocate()
35+
}
36+
println("terminate")
37+
}

GC/code/12/gc.txt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
$ GODEBUG=gctrace=1 ./main
2+
3+
gc 1 @0.000s 2%: 0.009+0.23+0.004 ms clock, 0.11+0.083/0.019/0.14+0.049 ms cpu, 4->6->2 MB, 5 MB goal, 12 P
4+
scvg: 8 KB released
5+
scvg: inuse: 3, idle: 60, sys: 63, released: 57, consumed: 6 (MB)
6+
gc 2 @0.001s 2%: 0.018+1.1+0.029 ms clock, 0.22+0.047/0.074/0.048+0.34 ms cpu, 4->7->3 MB, 5 MB goal, 12 P
7+
scvg: inuse: 3, idle: 60, sys: 63, released: 56, consumed: 7 (MB)
8+
gc 3 @0.003s 2%: 0.018+0.59+0.011 ms clock, 0.22+0.073/0.008/0.042+0.13 ms cpu, 5->6->1 MB, 6 MB goal, 12 P
9+
scvg: 8 KB released
10+
scvg: inuse: 2, idle: 61, sys: 63, released: 56, consumed: 7 (MB)
11+
gc 4 @0.003s 4%: 0.019+0.70+0.054 ms clock, 0.23+0.051/0.047/0.085+0.65 ms cpu, 4->6->2 MB, 5 MB goal, 12 P
12+
scvg: 8 KB released
13+
scvg: inuse: 3, idle: 60, sys: 63, released: 56, consumed: 7 (MB)
14+
scvg: 8 KB released
15+
scvg: inuse: 4, idle: 59, sys: 63, released: 56, consumed: 7 (MB)
16+
gc 5 @0.004s 12%: 0.021+0.26+0.49 ms clock, 0.26+0.046/0.037/0.11+5.8 ms cpu, 4->7->3 MB, 5 MB goal, 12 P
17+
scvg: inuse: 5, idle: 58, sys: 63, released: 56, consumed: 7 (MB)
18+
gc 6 @0.005s 12%: 0.020+0.17+0.004 ms clock, 0.25+0.080/0.070/0.053+0.051 ms cpu, 5->6->1 MB, 6 MB goal, 12 P
19+
scvg: 8 KB released
20+
scvg: inuse: 5, idle: 58, sys: 63, released: 56, consumed: 7

0 commit comments

Comments
 (0)