package main import ( "log" "net/http" _ "net/http/pprof" // 注册 pprof 相关 handler "time" ) // memoryBlocks 保留一部分内存块,方便内存剖析观察。 // 这个全局变量会一直存活,便于分析堆上的对象。 var memoryBlocks [64][]byte func main() { // 启动 pprof HTTP 服务 go func() { log.Println("pprof server started at http://localhost:6060/debug/pprof/") if err := http.ListenAndServe("localhost:6060", nil); err != nil { log.Fatal(err) } }() // 模拟 CPU 密集型业务 go cpuIntensiveTask() // 模拟内存分配型业务 go memoryIntensiveTask() // 阻塞主协程,让程序持续运行 select {} } // fib 递归计算斐波那契数列,非常耗费 CPU func fib(n int) int { if n <= 1 { return n } return fib(n-1) + fib(n-2) } // cpuIntensiveTask 循环执行 CPU 密集型计算 func cpuIntensiveTask() { for { _ = fib(30) } } // memoryIntensiveTask 循环分配内存并保留在全局切片中 func memoryIntensiveTask() { for i := 0; ; i++ { idx := i % len(memoryBlocks) // 每次分配 1MB,替换掉旧的内存块 memoryBlocks[idx] = make([]byte, 1<<20) // 1 << 20 = 1MB time.Sleep(100 * time.Millisecond) } }