- 将现有练习及 module 文件迁移至 go/practice,保持代码和依赖不变 - 新增 go/projects 项目区说明,更新目录约定与开发命令 BREAKING CHANGE: Go 练习命令需改在 go/practice 目录下执行
56 lines
1.2 KiB
Go
56 lines
1.2 KiB
Go
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)
|
|
}
|
|
} |