专栏首页java一日一条细说 MySQL 之 MEM_ROOT

细说 MySQL 之 MEM_ROOT

这篇文章会详细解说MySQL中使用非常广泛的MEM_ROOT的结构体,同时省去debug部分的信息,仅分析正常情况下,mysql中使用MEM_ROOT来做内存分配的部分。

在具体分析之前我们先例举在该结构体使用过程中用到的一些宏:

下面再来看看MEM_ROOT结构体相关的信息:

以下是分配具体的block信息.

其实MEM_ROOT在分配过程中,是通过双向链表来管理used和free的block:

MEM_ROOT的初始化过程如下:

初始化过程中,block_size空间为block_size-ALLOC_ROOT_MIN_BLOCK_SIZE。因为在内存不够,需要扩容时,是通过mem_root->block_num >>2 * block_size 来扩容的,所以mem_root->block_num >>2 至少为1,因此在初始化的过程中mem_root->block_num=4(注:4>>2=1)。

下面来看看具体分配内存的步骤:

上述代码的具体逻辑如下:

1.查看free链表,寻找满足空间的block。如果找到了合适的block,则: 1.1 直接返回该block从size-left处的初始地址即可。当然,在free list遍历的过程中,会去判断free list 中第一个block中left的空间不满足需要分配的空间,且该block中已经查找过了10次 (ALLOC_MAX_BLOCK_USAGE_BEFORE_DROP)都不满足分配长度,且该block剩余空间小于 4k(ALLOC_MAX_BLOCK_TO_DROP),则将该block 移动到used链表中。

2.如果free链表中,没有合适的block,则: 2.1 分配 mem_root->block_size * (mem_root->block_num >> 2)和length+ALIGN_SIZE(sizeof(USED_MEM)) 中比较大的作为新的block内存空间。 2.2 根据该block的使用情况,将该block挂在used或者free链表上。

这里需要注意的是二级指针的使用:

prev指向的是最后一个block的next指向的地址的地址:

所以将prev的地址替换为new block的地址,即将该new block加到了free list的结尾:*prev=next;

总结:

MEM_ROOT的内存分配采用的是启发式分配算法,随着后续block的数量越多,单个block的内存也会越大:block_size= mem_root->block_size * (mem_root->block_num >> 2) .

本文分享自微信公众号 - java一日一条(mjx_java),作者:收听我

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-11-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何用Map对象创建Set对象

    Java中的Map和Set有不少相似之处。本文将分享一个把Map类转化成Set类的小技巧。

    哲洛不闹
  • 如何用Map对象创建Set对象

    Java中的Map和Set有不少相似之处。本文将分享一个把Map类转化成Set类的小技巧。

    哲洛不闹
  • Java 容器 & 泛型(2):ArrayList 、LinkedList和Vector比较

    序列(List),有序的Collection,正如它的名字一样,是一个有序的元素列表。确切的讲,列表通常允许满足 e1.equals(e2) 的元素对 e1 和...

    哲洛不闹
  • 编译器 bug 系列(1)

    作为客户端开发者,我们每天都在接触编译器带来的便利,避免了手写机器码的麻烦,但是,某些情况下,编译器也会代码很多负面的作用。

    酷酷的哀殿
  • iOS block探究(一): 基础详解你要知道的block都在这里

    你要知道的block都在这里 转载请注明出处 https://cloud.tencent.com/developer/user/1605429 本文大纲 blo...

    WWWWDotPNG
  • Block 小结block  的 储存位置block  的循环引用

    陈雨尘
  • 5.Block的内存管理 内存管理内存管理block的循环引用

    陈雨尘
  • 【iOS】block小记

    VV木公子
  • iOS底层原理总结 - 探寻block的本质(一)

    xx_Cc
  • iOS block的一些理解和注意点

    大壮

扫码关注云+社区

领取腾讯云代金券