44 lines
1.2 KiB
Go
44 lines
1.2 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"runtime"
|
|
"time"
|
|
)
|
|
|
|
// printGCStats 打印GC核心统计信息
|
|
func printGCStats() {
|
|
var stats runtime.MemStats
|
|
runtime.ReadMemStats(&stats)
|
|
|
|
fmt.Println("===== GC 统计信息 =====")
|
|
fmt.Printf("当前堆分配内存: %d MB\n", stats.Alloc/1024/1024) // 等价于HeapAlloc
|
|
fmt.Printf("存活使用堆内存: %d MB\n", stats.HeapInuse/1024/1024) // 真正的存活内存
|
|
fmt.Printf("空闲待回收内存: %d MB\n", stats.HeapIdle/1024/1024) // 垃圾内存
|
|
fmt.Printf("累计 STW 时长: %.3f ms\n", float64(stats.PauseTotalNs)/1e6)
|
|
fmt.Printf("GC 总次数: %d\n", stats.NumGC)
|
|
fmt.Printf("最近一次 STW 时长: %.3f μs\n", float64(stats.PauseNs[(stats.NumGC+255)%256])/1e3)
|
|
fmt.Printf("下一次GC触发阈值: %d MB\n", stats.NextGC/1024/1024) // 下次GC的内存阈值
|
|
fmt.Println("=======================\n")
|
|
}
|
|
|
|
func main() {
|
|
// 后台定时打印GC状态
|
|
go func() {
|
|
for {
|
|
printGCStats()
|
|
time.Sleep(3 * time.Second)
|
|
}
|
|
}()
|
|
|
|
// 模拟高频内存分配,触发GC
|
|
data := make([][]byte, 0)
|
|
for i := 0; i < 100; i++ {
|
|
data = append(data, make([]byte, 10*1024*1024)) // 每次分配10MB
|
|
time.Sleep(200 * time.Millisecond)
|
|
}
|
|
|
|
// 阻塞程序退出
|
|
select {}
|
|
}
|