Golang内存、指针逃逸、垃圾回收机制概览
package main
import (
"fmt"
"runtime"
"runtime/debug"
)
func main() {
// 设置GCPercent为100,确保每次垃圾回收都会打印信息
debug.SetGCPercent(100)
// 初始化内存分配统计信息
m1 := new(runtime.MemStats)
runtime.ReadMemStats(m1)
// 分配内存
a := make([]*byte, 1000000)
for i := 0; i < len(a); i++ {
b := new(byte)
a[i] = b
}
// 再次读取内存统计信息并打印
runtime.ReadMemStats(m1)
fmt.Printf("分配内存后的统计信息: %+v\n", *m1)
// 强制进行垃圾回收并打印回收结果
runtime.GC()
debug.FreeOSMemory()
// 读取最终的内存统计信息并打印
m2 := new(runtime.MemStats)
runtime.ReadMemStats(m2)
fmt.Printf("垃圾回收后的统计信息: %+v\n", *m2)
}
这段代码首先设置了GC百分比为100,确保每次垃圾回收都会打印信息。然后初始化了内存分配的统计信息并读取当前的内存状态。接下来,代码创建了一个包含100万个指针的切片,每个指针指向一个新分配的字节类型的内存地址。之后再次读取内存统计信息并打印。接着代码强制进行垃圾回收,并释放未使用的内存。最后,代码读取回收后的内存统计信息并打印。这个过程可以帮助理解Go语言的内存分配和垃圾回收机制。
评论已关闭