gc 内存快照
简介
用于统计 driver 运行时内存占用情况的工具。
mem_snapshot 方法统计不同 snapshot 下的 handle 数量的相对改变,缺点是无法获取具体的内存大小仅能获得某类成员的相对数量。
mem_record 则是记录某一内存申请位置已申请但未释放的内存大小,缺点是只能记录内存申请位置无法知晓已申请内容具体被哪个 handle 引用,需要自己分析代码,且 mem_record 必须在内存申请前就开启。
gc_snapshot 则是通过日志记录的内存 block 描述,大小,引用关系,生成 block-ref 日志。再通过 profiler-tool 解析后以可视化的形式展示出来。
gc 内存快照
gs 支持的 snapshot 方法有两个
- gc.snapshot_target 方法
- gc.snapshot_target 用于内存申请后,记录某一指定 unit 引用到的内存的 block-ref 日志。
void snapshot_target, (mixed search_unit, int max_round = 3, int max_log_limit = 2097152, bool record_handle_ref = true, int element_limit = 3, int layer_limit = 2)
在driver 的 root 路径生成 search_unit 的 block-ref日志
search_unit: snapshot_target 会记录 search_unit 所能 gc mark 到的所有 block 内存成员并生成日志。
max_round: snapshot_target 的 gc_search 执行轮次。
max_log_limit: 最大的 block-ref 日志数量, 在生成日志的过程中可能的最大内存使用量为 512 * max_log_limit 字节。
record_handle_ref: 决定 snapshot_target 是否会记录跨handle的引用。
element_limit:block生成Array/Map等reference类型描述的最大成员数量。
layer_limit:block生成Array/Map等reference类型描述的最大层数限制。
- gc.snapshot_target 用于内存申请后,记录某一指定 unit 引用到的内存的 block-ref 日志。