PostgreSQL

内存上下文背景:

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

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

PostgreSQL - HelloWorld