关于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 公布!

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理