缓冲区和内存管理¶
在 Fission 之后的世界中,跨多个线程和进程的精确内存管理尤其重要。为了实现这一点,分析器使用了分块缓冲区策略。
ProfileBuffer 是控制配置文件内存和存储的总体缓冲区类,它允许将对象分配到其中。标记和样本等内容可以自由地使用它来将数据存储为条目,而无需了解内存管理的总体策略。
ProfileBuffer 由 ProfileChunkedBuffer 支持。此专用缓冲区通过分配额外的 ProfileBufferChunk 对象来增量增长。将分配越来越多的块,直到达到内存限制,然后释放它们。释放后,块将被回收或释放。
内存用量的限制由父进程中的 ProfilerParent 协调。 ProfilerParent 和 ProfilerChild 交换包含内存使用信息 的 IPC 消息。当超过最大字节阈值时,父进程中的 ProfileChunkManager 会删除最旧的块,然后 ProfilerParent 向所有子进程发送 DestroyReleasedChunksAtOrBefore 消息,以便释放配置文件中最旧的块。这有助于长时间的配置文件在类似的时间范围内保留数据。
配置文件缓冲区术语¶
- ProfilerParent
主要的分析器机制安装在父进程中。它使用 IPC 与子进程通信。PProfiler 是用于跨进程通信以协调事物的参与者。请参阅 ProfilerParent.h。ProfilerParent 使用 DestroyReleasedChunksAtOrBefore 消息来控制整体块限制。
- ProfilerChild
ProfilerChild 安装在每个子进程中,它将接收来自 DestroyReleasedChunksAtOrBefore 的请求。
- 条目
这是 ProfileBuffer.h 中的单个条目。这些条目的大小与块的大小无关。单个条目可以跨越两个不同的块。一个条目可以包含各种数据,例如标记、样本和堆栈。
- 块
由 ProfileChunkedBuffer 和来自 ProfilerParent 的 IPC 调用管理的任意大小的内存块。
- 未释放的块
此块当前正在用于写入条目。
- 已释放的块
此块已满数据。当发生内存限制时,它可以被回收或释放。
- 回收的块
这是一个以前写入并已满的块。当发生内存限制时,它会被重复使用作为下一个块,而不是释放内存。