Files
bulma/gc_basic_monitor.go
T

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 {}
}