首页 > 技术文章 > PostgreSQL-内存上下文

itsad 2019-09-27 17:22 原文

 

内存上下文背景:

需要经常处理大量以指针传值的查询,存在内存泄漏的问题,直到查询结束才能收回内存。所以实现了新的内存管理机制-内存上下文(MemoryContext)

内存上下文通俗解释:

一个内存上下文相当于一个进程环境,进程环境间不互相影响,pgSQL提供了在内存上下文进行内存操作的函数:pallloc、pfree、repalloc等。

MemoryContext:

pgSQL的每一个子进程都拥有多个私有的内存上下文,每个子进程的内存上下文组成一个树形结构,根节点为TopMemoryContext。

创建一个新的内存上下文,将其添加到已有的内存上下文作为子节点。清除内存的时候可以从根节点遍历,将所有节点的内存完全释放

内存处理函数:包含了对内存上下文进行操作的函数集合

 

 1.对内存上下文的操作,都是全局变量AllocSetMethods中实现的操作函数来控制的。

 2.在任何时候,都有一个"当前"的MemoryContext,记录在全局变量CurrentMemoryContext。进程就在这个内存上下文中调用palloc分配内存。

 3.变换内存上下文,使用MemoryContextSwitchTo函数

AllocSet:

管理一个内存上下文中的内存块是通过AllocSet结构完成,MemoryContext只作为AllocSet头部信息,AllocSet是指向AllocSetContext结构的类型指针。

 

 可以在进行重置的时候,检查isReset是否为true,如果为true就不需要重置操作,提高效率。

keeper在重置时只会把内存里的内容删除。

MemoryContext创建与初始化:

调用MemoryContextInit做初始化。先创建根节点TopMemoryContext,然后在该节点下创建ErrorContext用于错误恢复处理

推荐阅读