Go Wiki:heapdump15 到 heapdump17
其他版本的堆转储格式
- Go 1.3:heapdump13
- Go 1.4:heapdump14
简介
Go 1.5 具有一个 runtime/debug.WriteHeapDump 函数,该函数将堆中的所有对象以及附加信息(根、goroutine、终结器等)写入文件。此文件的格式在此处指定。
详细信息
该文件以字符串“go1.5 heap dump\n”的字节开头。此说明也适用于以“go1.6 heap dump\n”和“go1.7 heap dump\n”开头的文件。go1.6 格式与 1.5 相同,而 go1.7 格式有一个小的更改,如下所述。
文件的其余部分是一系列记录。记录可以是几种不同的类型。记录将包含以下基本类型
- uvarint - 一个 64 位无符号整数,编码方式如 encoding/binary.{Put,Read}Uvarint 中所述
- string - uvarint 编码的长度,后跟相同数量的字节数据
- bool - uvarint 编码的 0 表示 false,1 表示 true
- fieldlist - 对内存区域中包含指针的部分的描述。它由成对重复的 uvarint 编码字段类型和字段偏移量组成,后跟一个列表结束标记。唯一可能的类型是 1=Ptr。早期版本的堆转储可能包含 2=Iface 和 3=Eface,但运行时不再跟踪该信息,因此它不存在于转储中。接口值显示为一对指针。0=Eol 是列表结束标记。列表结束标记没有对应的偏移量。
每条记录都以 uvarint 编码的整数开头,描述记录的类型
- 0 = EOF
- 1 = object
- 2 = otherroot
- 3 = type
- 4 = goroutine
- 5 = stack frame
- 6 = dump params
- 7 = registered finalizer
- 8 = itab
- 9 = OS thread
- 10 = mem stats
- 11 = queued finalizer
- 12 = data segment
- 13 = bss segment
- 14 = defer record
- 15 = panic record
- 16 = alloc/free profile record
- 17 = alloc stack trace sample
每条记录的其余字段与类型相关,如下所述。
EOF
EOF 记录没有字段,必须最后出现。
object
- uvarint:对象的地址
- string:对象的内容
- fieldlist:描述对象的包含指针的字段
内容字符串的大小是包含的 sizeclass 的大小,而不是对象本身的大小。因此,内容大小可能比包含对象的类型大一些。
otherroot
- string:此根来自何处的文本描述
- uvarint:根指针
type
- uvarint:类型描述符的地址
- uvarint:此类型对象的 size
- string:类型的名称
- bool:包含此类型值的接口的数据字段的类型是 T (false) 还是 *T (true)
goroutine (G)
- uvarint:描述符的地址
- uvarint:指向堆栈顶部(当前运行的帧,又称深度 0)
- uvarint:go 例程 ID
- uvarint:创建此 goroutine 的 go 语句的位置
- uvarint:状态
- bool:是否是由系统启动的 Go 例程
- bool:是否为后台 Go 例程
- uvarint:go 例程上次开始等待的近似时间(自纪元以来的纳秒数)
- 字符串:等待的原因文本
- uvarint:当前运行帧的上下文指针
- uvarint:操作系统线程描述符 (M) 的地址
- uvarint:顶部 defer 记录
- uvarint:顶部 panic 记录
可能的状态
- 0 = 空闲
- 1 = 可运行
- 3 = 系统调用
- 4 = 等待
在所有情况下都必须存在等待字段,但仅当状态为“等待”时它们才有意义。
堆栈帧
- uvarint:堆栈指针(帧中的最低地址)
- uvarint:堆栈深度(0 = 堆栈顶部)
- uvarint:子帧的堆栈指针(如果没有,则为 0)
- 字符串:堆栈帧的内容
- uvarint:函数的入口 PC
- uvarint:函数的当前 PC
- uvarint:函数的延续 PC(函数可能在其中恢复,如果存在的话)
- 字符串:函数名称
- fieldlist:此帧中包含指针的字段的类型和偏移量的列表
转储参数
- bool:大端
- uvarint:以字节为单位的指针大小
- uvarint:堆的起始地址
- uvarint:堆的结束地址
- 字符串:架构名称
- 字符串:GOEXPERIMENT 环境变量值
- uvarint:runtime.ncpu
终结器
- uvarint:具有终结器的对象的地址
- uvarint:指向描述终结器的 FuncVal 的指针
- uvarint:终结器入口点的 PC
- uvarint:终结器参数的类型
- uvarint:对象的类型
此终结器已在运行时系统中注册,但它引用的对象在最近的 GC 中可达,或在最近的 GC 之后分配。
itab
- uvarint:Itab 地址
- uvarint:指向包含类型的类型描述符的地址
- 在 go1.6 之前,类型始终为指针类型,并表示 itab.data 字段的类型。
- 从 go1.7 及更高版本开始,类型是存储在接口中的类型。要决定 itab.data 字段是 T 还是 *T,需要查看所引用类型的描述符中的最后一个布尔值。
osthread (M)
- uvarint:此 os 线程描述符的地址
- uvarint:线程的 Go 内部 ID
- uvarint:线程的操作系统 ID
memstats
记录以下字段:runtime.MemStats
- uvarint:Alloc
- uvarint:TotalAlloc
- uvarint:Sys
- uvarint:Lookups
- uvarint:Mallocs
- uvarint:Frees
- uvarint:HeapAlloc
- uvarint:HeapSys
- uvarint:HeapIdle
- uvarint:HeapInuse
- uvarint:HeapReleased
- uvarint:HeapObjects
- uvarint:StackInuse
- uvarint:StackSys
- uvarint:MSpanInuse
- uvarint:MSpanSys
- uvarint:MCacheInuse
- uvarint:MCacheSys
- uvarint:BuckHashSys
- uvarint:GCSys
- uvarint:OtherSys
- uvarint:NextGC
- uvarint:LastGC
- uvarint:PauseTotalNs
- 256 uvarints:PauseNs
- uvarint:NumGC
queuedfinalizer
- uvarint:具有终结器的对象的地址
- uvarint:指向描述终结器的 FuncVal 的指针
- uvarint:终结器入口点的 PC
- uvarint:终结器参数的类型
- uvarint:对象的类型
此终结器已准备好运行 - 它引用的对象不可达。运行时系统只是还没有开始运行它。
data
- uvarint:数据段开头的地址
- string:数据段的内容
- fieldlist:数据段中包含指针的字段的类型和偏移量。
bss
格式与 data 相同,但适用于 bss 段。
defer
- uvarint:defer 记录地址
- uvarint:包含的 goroutine
- uvarint:argp
- uvarint:pc
- uvarint:defer 的 FuncVal
- uvarint:defer 入口点的 PC
- uvarint:链接到下一个 defer 记录
panic
- uvarint:panic 记录地址
- uvarint:包含的 goroutine
- uvarint:panic 参数 eface 的类型指针
- uvarint:panic 参数 eface 的数据字段
- uvarint:指向当前正在运行的 defer 记录的指针
- uvarint:链接到下一个 panic 记录
alloc/free 配置文件记录
- uvarint:记录标识符
- uvarint:已分配对象的尺寸
- uvarint:堆栈帧数。对于每个帧
- 字符串:函数名称
- string:文件名
- uvarint:行号
- uvarint:分配数
- uvarint:释放数
alloc 样本记录
- uvarint:对象的地址
- uvarint:alloc/free 配置文件记录标识符
此内容是 Go Wiki 的一部分。