内存上下文背景:
需要经常处理大量以指针传值的查询,存在内存泄漏的问题,直到查询结束才能收回内存。所以实现了新的内存管理机制-内存上下文(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用于错误恢复处理