内存分析

从原生分配中采样堆栈

分析器可以使用“原生分配”功能对 malloc 的分配和释放进行采样。可以通过访问 about:profiling 并启用“原生分配”复选框来启用此功能。它仅在 Nightly 版本中可用,因为它使用了一种挂钩到 malloc 的技术,这种技术应用于更广泛的 Firefox 用户群体可能存在一些风险。

此实现位于:tools/profiler/core/memory_hooks.cpp

它的工作原理是挂钩到所有 malloc 调用。当分析器运行时,它会执行 伯努利试验,该试验将以给定的每个字节分配概率通过。这意味着与较小的分配相比,较大的分配有更高的记录机会。目前,无法配置每个字节的概率。这意味着采样的分配大小将更接近实际分配的字节数。

此基础设施与 DMD 非常相似,但它还具有使其易于打开并与分析器一起使用的额外动机。开销非常高,尤其是在堆栈回溯成本更高的系统(如 Linux)上。关闭“原生堆栈”功能可以帮助降低开销,但会提供较少的信息。

有关分析这些配置文件的更多信息,请参阅 Firefox 分析器文档

内存计数器

与“原生分配”功能类似,内存计数器使用仅在 Nightly 版本中可用的 malloc 内存挂钩。在可用时,内存计数器始终处于打开状态。这是一种轻量级的方式,可以非常细粒度地统计在分析会话期间分配和释放了多少内存。

此信息然后在 Firefox 分析器内存轨迹 中可视化。

此功能使用 Profiler 计数器,可用于创建其他类型的廉价计数插桩。