当前位置: 首页 > 网络应用技术

PPROF:Alloc完整流程分析

时间:2023-03-06 22:20:04 网络应用技术

  Mallocgo在堆上的内存分配将调用Malloc函数。

  Malloc将采样,默认的平均512KB(索引分布的平均值)分配给样品,并将采样数据放置在雾中。

  MEMRECORD从MEMRECORD的角度标记为Mark终止。上一轮Mark终止先前分配的记忆以及本回合的Mark终止(正是上一轮分配的一轮)被用作快照。

  换句话说,我们通过Memprofile获得的记录实际上是Mark终止之前的内存SANPSHOT。

  在memrecord中,有一个[未来]可以存储膜周期,以指示不同的GC循环的数据。

  Active代表当前有效分析数据,即GC之前的数据。

  MEMRECORDCLE包括分配字节和分配的数量。释放字节,版本的数量。

  BucketMprofalloc将使用用户Malloc生成的调用堆栈来生成一个存储桶,然后使用用户的用户调用堆栈,以及memrecordcycle和其他信息。

  此目的是不要存储相同的调用堆栈。

  在最后的统计数据中,诸如所有存储桶中的MEMRECORDCYCLE之类的累积信息获得了诸如totalalloc之类的信息。

  用户的每个呼叫可能包含许多堆栈信息。

  堆栈指针,内存分配信息等将存储到一个存储桶中。

  水桶如下。

  该存储桶还包括一系列[]大学(指呼叫堆栈的地址)和Memrecord或BlockRecord {}

  通过Buckethash Hashmap(链接地址方法)将不同的存储桶放在一块中。

  Buckethash函数使用哈希函数调用堆栈来生成哈希。称为堆栈的同一存储桶和由Malloc分配的大小将放置在同一桶中。

  然后,每次生成新的存储桶时,都会更新相应的全局变量。对于Memprofile,Mbucket指向此水桶。

  所有水桶都可以通过Mbucket获得。

  MEMPROFILEMEMPROFILE是当Allocs实际上是Allocs时运行时/PPROF的操作。

  它将遍历所有mbuckets,并获得呼叫堆栈 - > allocs和alloc_bytes的集合。

  穿越Mbucket时。

  如此严格的是,如果GC的数量小于2,那么您所获得的实际上不是以一致的状态拍摄的。

  在文件的第一行中,写入分配的字节,对象和其他信息以及memprofilerate。准确的)

  将通话堆栈滞后。对于每个呼叫堆栈,首先打印字节和堆栈地址,由呼叫堆栈分配。

  对于调用堆栈,请从头到尾打印每个特定的堆栈信息。

  在其中,如果第一个函数名称是运行时,则它将被忽略(因为运行时函数通常在DEFUG ALLOC时无用),除非所有功能名称均为运行时。

  对于堆栈,打印以下数据,包括框架文件名,行号,PC地址,FUNC名称和其他数据。

  随后打印备忘录和maxrss。

  当火焰图表时,我们想直接在命令行中调用异载体,如下所示。

  当调试是1时,它表明以文本的形式打印人类可读文件,以0的形式以原始形式打印文件。

  文件不仅形成不同,当触发器还将对返回的数据本身执行一些处理操作。

  如果我们同时以文本和原始形式打印文件,我们会发现proto生成的UI。其中,总零件不能与文本或任何其他相应的对应关系中的总堆ALOC相对应。

  在生成原始文件时,它将扩增由memprofilinerate生成的分配,同种对象,insusbytes,inuseObjects等。