2.4.1 初始化内存上下文
PostgreSQL 7.1以前的版本在处理大量以指针传值的查询时一直存在着内存泄漏的问题,直到查询结束才能将内存收回。为了解决这个问题,从版本7.1开始,系统实现了新的内存管理机制,这样使得运行时大多数内存分配操作在各种语义的内存上下文(MemoryContext)中进行。内存上下文释放时将会释放在其中分配的所有内存,这样即使某些内存没有被任何指针指向或忘记了释放,我们都可以通过释放内存上下文来避免这些内存泄漏。这一机制也使内存管理更加方便,开发人员不必再费尽心思地处理内存释放的工作。关于MemoryContext的具体分析和介绍请参见3.3.1节。
程序首先调用MemoryContextInit创建TopMemoryContext和ErrorContext。然后调用AllocSetContextCreate以TopMemoryContext为根节点创建PostmasterContext,最后将全局指针CurrentMemoryContext指向PostmasterContext。这些内存上下文的具体含义如下:
TopMemoryContext:在TopMemoryContext中分配的内存直到系统退出时才会释放。例如:TopMemoryContext中存放了所有打开的文件描述符、内存上下文的控制节点等。它是所有内存上下文的树根。
ErrorContext:这是错误恢复处理的永久性内存环境,恢复完毕则重设。
PostmasterContext:这是Postmaster正常工作的内存环境,由它通过fork函数产生的子进程将会删除这个环境。
【责任编辑:云霞 TEL:(010)68476606】