41 lines
853 B
Go
41 lines
853 B
Go
package main
|
||
|
||
import (
|
||
"fmt"
|
||
"runtime"
|
||
)
|
||
|
||
// badFunc 局部大对象返回,触发逃逸
|
||
func badFunc() []byte {
|
||
buf := make([]byte, 1024*1024) // 1MB对象
|
||
return buf
|
||
}
|
||
|
||
// goodFunc 接收外部切片,复用内存,避免逃逸
|
||
func goodFunc(buf []byte) {
|
||
for i := range buf {
|
||
buf[i] = byte(i % 256)
|
||
}
|
||
}
|
||
|
||
func main() {
|
||
var stats runtime.MemStats
|
||
|
||
// 测试逃逸场景
|
||
runtime.GC()
|
||
for i := 0; i < 50; i++ {
|
||
_ = badFunc()
|
||
}
|
||
runtime.ReadMemStats(&stats)
|
||
fmt.Printf("逃逸场景:堆分配%d MB,GC次数%d\n", stats.HeapAlloc/1024/1024, stats.NumGC)
|
||
|
||
// 测试避免逃逸场景
|
||
runtime.GC()
|
||
buf := make([]byte, 1024*1024) // 一次分配,复用
|
||
for i := 0; i < 50; i++ {
|
||
goodFunc(buf)
|
||
}
|
||
runtime.ReadMemStats(&stats)
|
||
fmt.Printf("避免逃逸:堆分配%d MB,GC次数%d\n", stats.HeapAlloc/1024/1024, stats.NumGC)
|
||
}
|