https://golang.org/pkg/runtime/debug/
go-runtime/debug
程序包调试了包含程序在运行时进行调试功能
1.强制进行垃圾回收
2.设置垃圾回收的目标百分比
3.设置被单个go协程调用栈可使用的内存最大值
4.设置go程序可以使用的最大操作系统线程数
5.设置程序请求运行是只触发panic,而不崩溃
6.垃圾收集信息的写入stats中
7.将内存分配堆和其中对象的描述写入文件中
8.获取go协程调用栈踪迹
9.将堆栈踪迹打印到标准错误
1.强制进行垃圾回收
func FreeOSMemory()
SetGCPercent设定垃圾收集的目标百分比:当新申请的内存大小占前次垃圾收集剩余可用内存大小的比率达到设定值时,就会触发垃圾收集。SetGCPercent返回之前的设定。初始值设定为环境变量GOGC的值;如果没有设置该环境变量,初始值为100。percent参数如果是负数值,会关闭垃圾收集
设置go程序可以使用的最大操作系统线程数
func SetMaxThreads(threads int) int
设置程序请求运行是只触发panic,而不崩溃
func SetPanicOnFault(enabled bool) bool
https://www.jianshu.com/p/0b3d11f7af57
Mark Prepare - STW
做标记阶段的准备工作,需要停止所有正在运行的 goroutine(即 STW),标记根对象,启用内存屏障,内存屏障有点像内存读写钩子,它用于在后续并发标记的过程中,维护三色标记的完备性 (三色不变性),这个过程通常很快,大概在 10-30 微秒。
Marking - Concurrent
标记阶段会将大概 25%(gcBackgroundUtilization) 的 P 用于标记对象,逐个扫描所有 G 的堆栈,执行三色标记,在这个过程中,所有新分配的对象都是黑色,被扫描的 G 会被暂停,扫描完成后恢复,这部分工作叫后台标记 (gcBgMarkWorker)。这会降低系统大概 25% 的吞吐量,比如MAXPROCS=6,那么 GC P 期望使用率为6*0.25=1.5,这 150%P 会通过专职 (Dedicated)/兼职 (Fractional)/懒散 (Idle) 三种工作模式的 Worker 共同来完成。
这还没完,为了保证在 Marking 过程中,其它 G 分配堆内存太快,导致 Mark 跟不上 Allocate 的速度,还需要其它 G 配合做一部分标记的工作,这部分工作叫辅助标记 (mutator assists)。在 Marking 期间,每次 G 分配内存都会更新它的” 负债指数”(gcAssistBytes),分配得越快,gcAssistBytes 越大,这个指数乘以全局的” 负载汇率”(assistWorkPerByte),就得到这个 G 需要帮忙 Marking 的内存大小 (这个计算过程叫revise),也就是它在本次分配的 mutator assists 工作量 (gcAssistAlloc)。
Mark Termination - STW
标记阶段的最后工作是 Mark Termination,关闭内存屏障,停止后台标记以及辅助标记,做一些清理工作,整个过程也需要 STW,大概需要 60-90 微秒。在此之后,所有的 P 都能继续为应用程序 G 服务了
https://gocn.vip/topics/9822