在main函数开头直接加入如下代码,就可以得到heap采样结果mem.out。 func main() { f, _ := os.Create("mem.out") defer f.Close() runtime.GC() // 手动执行一次GC垃圾回收 if err := pprof.WriteHeapProfile(f); err != nil { log.Fatal("could not write memory profile: ", err) } ... }...
Heap: 是否在堆上分配 Sp: 栈指针 Pc: 调用方的程序计数器 Fn: defer关键字中传入的函数 _panic:defer中的panic Link: defer的链表,函数执行流程中的defer,会通过link 这个属性进行串联 GoPanic实现 异常判断 panic的入口实现是在panic.go文件里面的 gopanic方法。 612行 获取当前执行的g,Golang的GMP就不扩展...
goroutine:$HOST/debug/pprof/goroutine,查看当前所有运行的 goroutines 堆栈跟踪 heap(Memory Profiling):$HOST/debug/pprof/heap,查看活动对象的内存分配情况 mutex(Mutex Profiling):$HOST/debug/pprof/mutex,查看导致互斥锁的竞争持有者的堆栈跟踪 threadcreate:$HOST/debug/pprof/threadcreate,查看创建新OS线程的堆...
cpu 决定了程序在actively状态(而不是在sleeping或waiting I/O)时花费的cpu时间 heap 报告内存分配示例;用于监视当前和历史内存使用情况,并检查内存泄漏 threadcreate 报告程序中引导创建新线程的部分 goroutine 报告当前所有goroutine的堆栈跟踪 block 显示goroutine阻塞等待同步原语(包括timer channels),block profile默认...
2.4heapArena.pageMarks pageMarks这个位图看起来应该和GC标记有点儿关系,它的用法和pageInUse一样,只标记每个span的第一个page。在GC标记阶段会修改这个位图,标记哪些span中存在被标记的对象;在GC清扫阶段会根据这个位图,来释放不含标记对象的span。 2.5heapArena.spans ...
堆(heap):堆是用于存放进程执行中被动态分配的内存段。它的大小并不固定,可动态扩张或缩减。当进程调用 malloc 等函数分配内存时,新分配的内存就被动态加入到堆上(堆被扩张)。当利用 free 等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减);
heap(Memory Profiling):$HOST/debug/pprof/heap,查看活动对象的内存分配情况 mutex(Mutex Profiling):$HOST/debug/pprof/mutex,查看导致互斥锁的竞争持有者的堆栈跟踪 threadcreate:$HOST/debug/pprof/threadcreate,查看创建新OS线程的堆栈跟踪 二、通过交互式终端使用 ...
heapSort:堆排序 quickSort:快速排序 symMerge:归并排序 回到quickSort 方法中,发现它会自动选择使用排序算法 五、稳定性 包中也说明使用 sort.Sort() 不是稳定的 要想稳定,得使用 Stable() 函数 可以使用 sort.IntSlice{} 的方法实现 也可以使用自定义的方法实现 ...
heap:管理限制 span,需要时向操作系统申请新内存。 Golang 语言的内存分配器分配流程: 计算待分配对象对应的规格(size class)。 从cache.alloc 数组找到规格相同的 span。 从span.freelist 链表提取可用 object。 如span.freelist 为空,从central 获取新 span。
查看内存: go tool pprofhttp://127.0.0.1:7001/debug/pprof/heap 查看协程: go tool pprofhttp://127.0.0.1:7001/debug/pprof/goroutine 查看导致互斥锁的竞争持有者的堆栈跟踪: go tool pprofhttp://127.0.0.1:7001/debug/pprof/mutex 查看导致阻塞同步的堆栈跟踪 : go tool pprofhttp://127.0.0.1:7001/...