历史版本。 PostgreSQL 6.5 已结束支持。 请参阅 当前版本手册.
41.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 自动释放!