↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

已结束支持的版本: 6.5 / 6.3
历史版本。 PostgreSQL 6.3 已结束支持。 请参阅 当前版本手册.

40.3. 内存管理

服务器在内存上下文中分配内存,使得在一个上下文中做出的分配可以通过销毁该上下文来释放,而不影响在其他上下文中做出的分配。所有分配(通过 palloc 等)都是在被选为当前上下文的那个上下文中进行的。如果试图释放(或重新分配)不是在当前上下文中分配的内存,将会得到不可预知的结果。

内存上下文的创建和切换属于 SPI 管理器内存管理的内容。

SPI 过程涉及两个内存上下文:上层执行器内存上下文和过程内存上下文(如果已连接)。

在过程连接到 SPI 管理器之前,当前内存上下文是上层执行器上下文,因此该过程自身在连接到 SPI 之前通过 palloc/repalloc 或由 SPI 辅助函数所做的所有分配都位于这个上下文中。

调用 SPI_connect 之后,当前上下文是过程的私有上下文。通过 palloc/repalloc 或由 SPI 辅助函数所做的所有分配(SPI_copytuple、SPI_modifytuple、SPI_palloc 和 SPI_repalloc 除外)都位于这个上下文中。

当过程(通过 SPI_finish)与 SPI 管理器断开连接时,当前上下文会恢复为上层执行器上下文,而在该过程内存上下文中分配的所有内存都会被释放,不能再使用!

如果想把某些东西返回给上层执行器,就必须在上层上下文中为它分配内存!

SPI 无法自动释放上层执行器上下文中的分配!

查询执行期间分配的内存会在该查询完成时被 SPI 自动释放!

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.