49 lines
1.1 KiB
Go
49 lines
1.1 KiB
Go
package main
|
||
|
||
import (
|
||
"log"
|
||
"net/http"
|
||
_ "net/http/pprof" // 注册pprof HTTP端点
|
||
"os"
|
||
"runtime"
|
||
"runtime/trace"
|
||
"time"
|
||
)
|
||
|
||
// simulateAlloc 模拟高频内存分配
|
||
func simulateAlloc() {
|
||
for {
|
||
_ = make([]byte, 1*1024*1024) // 每次分配1MB
|
||
time.Sleep(10 * time.Millisecond)
|
||
}
|
||
}
|
||
|
||
func main() {
|
||
// 1. 启动trace追踪,输出到文件
|
||
f, err := os.Create("gc_trace.out")
|
||
if err != nil {
|
||
log.Fatalf("创建trace文件失败: %v", err)
|
||
}
|
||
defer f.Close()
|
||
trace.Start(f)
|
||
defer trace.Stop()
|
||
|
||
// 2. 启动pprof HTTP服务(端口6060)
|
||
go func() {
|
||
log.Println("pprof服务启动: http://localhost:6060/debug/pprof/")
|
||
log.Fatal(http.ListenAndServe(":6060", nil))
|
||
}()
|
||
|
||
// 3. 模拟内存分配压力
|
||
go simulateAlloc()
|
||
|
||
// 4. 运行30秒,积累诊断数据
|
||
log.Println("程序将运行30秒,可访问pprof分析GC...")
|
||
time.Sleep(30 * time.Second)
|
||
|
||
// 5. 打印最终GC状态
|
||
var stats runtime.MemStats
|
||
runtime.ReadMemStats(&stats)
|
||
log.Printf("运行结束,GC总次数: %d,累计STW时长: %d ms", stats.NumGC, stats.PauseTotalNs/1e6)
|
||
}
|