Memory Duty¶
PostgreSQL 的内存管理:
- MemoryContext:管内存数据。核心是“管理生命周期”,专供解析、运行所需临时数据,靠树形结构批量释放。
- Buffer Manager:管磁盘数据。核心是“缓存数据”,例如用 LRU 等算法把热点页留在内存,解决 IO 慢的问题。
- ResourceOwner:管资源归属。核心是“谁申请、谁负责释放”,用于跟踪事务/子事务持有的资源(如 buffer pin、锁、临时文件等),在事务结束或出错时统一回收,保证不会泄漏。
| 维度 | MemoryContext | Buffer Manager | ResourceOwner |
|---|---|---|---|
| 本质定义 | 生命周期管理器 | 数据缓存(通常进程间共享) | 资源归属与释放控制器 |
| 服务对象 | CPU / 计算逻辑 | 磁盘 / 持久化存储 | 事务 / 执行过程 |
| 核心关注 | 时间维度(生命周期) | 价值维度(热点数据) | 所有权维度(谁持有资源) |
| 数据性质 | 易失;临时副本、中间结果、解析树等 | 持久代理;数据、日志、clog等 | 资源句柄(lock、buffer pin、fd 等) |
| 管理机制 | 树形结构;批量操作 | 数组+算法;随机访问 | 栈/树结构(嵌套事务);数组记录资源 |
| 分配策略 | 弹性增长;按需分配 | 刚性限制;按需淘汰 | 显式登记;remember / forget |
| 清理方式 | 批量清零 (Reset) | 精细淘汰 (LRU/Clock) | 按作用域释放(事务结束统一释放) |
| 典型实现 | AllocSet, Generation, Slab |
Shared Buffers, Temp Buffers, WAL Buffers |
TopTransactionResourceOwner |