zoukankan      html  css  js  c++  java
  • 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用于错误恢复处理

  • 相关阅读:
    python:时间格式转化
    python:将时间戳格式化为yyyyMMdd hh:mm:ss
    Oracle 实现表中id字段自增长
    django:将query-set类型转为json类型
    mysql:获取某个表的所有字段
    Navicat连接Mysql8.0.11出现1251错误
    Java垃圾回收(GC)机制详解
    Mybatis学习总结(九)——查询缓存
    Mybatis学习总结(八)——延迟加载
    Mybatis学习总结(七)——调用存储过程
  • 原文地址:https://www.cnblogs.com/itsad/p/11599227.html
Copyright © 2011-2022 走看看