乐趣区

关于mysql:MySQL内存管理机制浅析

  • GreatSQL 社区原创内容未经受权不得随便应用,转载请分割小编并注明起源。
  • GreatSQL 是 MySQL 的国产分支版本,应用上与 MySQL 统一。

[toc]

一、placement new 的定义

通常状况下,C++ 中通过用 new 形式申请内存空间时,是在零碎的堆内存空间中进行调配,底层应用 C 规范库的 malloc() 实现内存调配工作。

因而本次申请的内存空间大小,是依据程序运行时对象的大小及应用状况来决定的。

然而某些场景中,可能须要事后调配实现内存空间,而后再把对象 ” 搁置 ” 在之前事后调配的内存空间上。即所谓的 placement new 操作。

定点搁置的 new 操作的语法不同于一般的 new 操作,比方:咱们个别在堆中申请内存空间,通常写:

Object* o = new Object();

而定点搁置 new 的语法模式为:

Object* o = new (pointer) Object();

这里的 pointer 就是事后调配好内存块的首地址。

二、placement new 应用场景

传统堆分配内存形式的弊病:通过 new 操作符进行堆内存的调配,操作系统须要在堆中找到间断且大小符合要求的内存空间,这个查问匹配的效率是低下的。

极其状况下可能因为空间有余,导致呈现内存调配失败的问题产生。

placement new调配形式:创立的对象都在事后调配好的内存缓冲区中操作,无需查问及匹配内存空间,内存调配的工夫是常量 O(1)。

因为在之前预留的内存空间进行调配,因而不会呈现程序运行时因为内存空间有余,导致内存调配失败的问题。

三、placement new 和 MySQL 内存管理机制的关系

正是因为上述 placement new 的机制个性,因而其非常适合那些对工夫,性能要求高,长时间运行,不心愿被中断的应用程序。例如数据库这类的利用场景,就是很好的例子。

MySQL 外部应用 mem_root 进行内存治理,能够实现屡次批量的内存空间申请,并且能够把对象搁置到 mem_root 定义的内存空间中,这样程序运行失败或者中途异样 crash 退出,咱们就无需关怀是否胜利开释内存。

所有都通过 mem_root 进行代理操作,整个内存的申请、调配、回收过程通明实现。

四、MySQL 中 mem_root 应用场景

// 申明 mem_root 对象
MEM_ROOT execute_mem_root;
Query_arena execute_arena(&execute_mem_root,Query_arena::STMT_INITIALIZED_FOR_SP);

// 预分配内存块空间
init_sql_alloc(key_memory_sp_head_execute_root, &mem_root,
               MEM_ROOT_BLOCK_SIZE, 0);

// 把 thd 中的 mem_root 指针指向 execute_mem_root 对应的内存块
thd->swap_query_arena(execute_arena, &backup_arena);

// 把对象调配在事后申请的 mem_root 上
LEX *sublex = new (thd->mem_root) st_lex_local;

// 一些逻辑计算操作
......

// 开释表空间
free_root(&execute_mem_root, MYF(0));

总结:MySQL 通过 mem_root 进行内存的对立申请、回收、治理。岂但晋升了内存调配的效率,进步了系统资源的利用率,而且缩小了内存碎片化,是 MySQL 性能晋升的一个重要抓手。

Enjoy GreatSQL :)

文章举荐:

面向金融级利用的 GreatSQL 正式开源
https://mp.weixin.qq.com/s/cI…

Changes in GreatSQL 8.0.25 (2021-8-18)
https://mp.weixin.qq.com/s/qc…

MGR 及 GreatSQL 资源汇总
https://mp.weixin.qq.com/s/qX…

GreatSQL MGR FAQ
https://mp.weixin.qq.com/s/J6…

在 Linux 下源码编译装置 GreatSQL/MySQL
https://mp.weixin.qq.com/s/WZ…

# 对于 GreatSQL

GreatSQL 是由万里数据库保护的 MySQL 分支,专一于晋升 MGR 可靠性及性能,反对 InnoDB 并行查问个性,是实用于金融级利用的 MySQL 分支版本。

Gitee:

https://gitee.com/GreatSQL/Gr…

GitHub:

https://github.com/GreatSQL/G…

Bilibili:

https://space.bilibili.com/13…

微信 &QQ 群:

可搜寻增加 GreatSQL 社区助手微信好友,发送验证信息“加群”退出 GreatSQL/MGR 交换微信群

QQ 群:533341697

微信小助手:wanlidbc

本文由博客一文多发平台 OpenWrite 公布!

退出移动版