这一部分是我在网上找Chakra资料的时候偶然发现的zenhumany师傅在Hitcon2015上的议题《Microsoft Edge MemGC Internals》,感觉正好可以了解一下chakra的底层机制。但是只有一个PPT理解起来比较费力,这里的内容一方面是靠理解ppt,一方面是靠看代码和调试,可能有不正确的地方。

GC的管理模式

Chakra GC use Concurrent Mark-Sweep (CMS) Managing Memory.

Edge use the same data structures to mange DOM and DOM’S supporting objects, called MemGC.

GC针对堆的管理

GC根据分配的size大小分为三类的block。

总体的管理器为HeapInfo

class	HeapInfo
m_HeapBucketGroup[0x40] 数组
m_LargeHeapBucket[0x20] 数组
m_lastLargeHeapBucket
  • 0x400byte以下为small block (目前版本可能改成了0x300)

    数据结构

      pHeapInfo
    ->m_HeapBucketGroup[index]
    ->m_HeapBucketT<SmallNormalHeapBlock>(子结构)
    ->pSmallHeapBlockAllocatorT(子结构)
    ->pSmallHeapBlock class HeapBucketT<SmallNormalHeapBlock>
    size
    m_SmallHeapBlockAllocator
    pPartialReuseHeapBlockList
    pEmptyHeapBlockList
    pFullMarkedHeapBlockList
    pPendingNewHeapBlockList

    HeapBucketT是模版类用于对应不同的block类型,目前还不清楚各个list的作用,一些似乎是用于垃圾回收的

    其中SmallHeapBlockAllocator是small block分配的重要结构,startaddress域保存有下一次分配的起始地址,

      SmallHeapBlockAllocator<SmallNormalHeapBlock>
    0x00 endadderss
    0x04 startaddress
    0x08 pSmallNormalHeapblock

    其中SmallHeapBlockAllocator是直接的内存控制结构。

    pSmallNormalHeapblock是直接对应buffer的底层结构

    分配的过程如下:

      pHeapInfo->
    m_HeapBucketGroup[ index].m_HeapBucketT<SmallNormalHeapBlock>->
    pSmallHeapBlockAllocatorT(子结构)->
    pSmallHeapBlock allocAddress = pHeapBucketT->startAddress;//取pSmallHeapBlockAllocatorT中地址
    ...//省略了一些校验
    pSmallHeapBlockAllocator->startAddress = pHeapBucketT->startAddress + align_size;
    return allocAddress;

    分配是通过直接读取操作pSmallHeapBlockAllocatorT中的address实现的

    但是如果startaddress不存在的话会进入另一个分配机制称为慢分配

       if( pSmallHeapBlockAllocator->startAddress ==0 || pSmallHeapBlockAllocator->endAddress!=0 )
    {
    allocAddress = pHeapBucketT->SnailAlloc(pRecycler, pSmallHeapBlockAllocator, align_size, 8, 1);
    if( allocAddress == 0)
    return 0;
    else
    *allocAddress = 0;
    return allocAddress
    }
  • 0x400-0x2400为large block (目前版本的size范围有不同)

    数据结构

      pHeapInfo
    ->m_LargeHeapBucket[index]
    ->pNewLargeHeapBlockList

    分配过程

      pHeapInfo->m_LargeHeapBucket[ largebucketIndex]->pLargeHeapBlockList->Alloc( align_size, 8)
    allocAddress = pLargeHeapBlock ->Alloc( align_size, 8)
    return allocAddress; Recycler::LargeAlloc
    allocAddress = Recycler::LargeAlloc( pHeapInfo, size, 8 )//使用到了Recycler
    *allocAddress = 0;
    return allocAddress;

    其中LargeHeapBlock是底层的内存管理结构

    LargeHeapBlock管理着LargeObjectHeader和对应的buffer

      LargeObjectHeader
    Buffer
    LargeObjectHeader
    Buffer

    LargeObjectHeader存在分配的序号进行排列

      struct LargeObjectHeader
    {
    uint objectIndex;//分配的序号
    UINT_PAD_64BIT(unused1);
    size_t objectSize;//用户申请的大小
    }
  • 0x2400以上 last large alloc

    //to do

Recycler管理

class	Recycler
0x26c m_HeaoBlock32Map
0x42bc m_HeapInfo

//to do

HeapBlock32Map

//to do

Chakra GC内存管理(未完)的更多相关文章

  1. 一文了解.Net的CLR、GC内存管理

    一文了解.Net的CLR.GC内存管理 微软官方文档对内存管理和CLR的概述 什么是托管代码? 托管代码就是执行过程交由运行时管理的代码. 在这种情况下,相关的运行时称为公共语言运行时 (CLR),不 ...

  2. C++解析(31):自定义内存管理(完)

    0.目录 1.遗失的关键字mutable 2.new / delete 3.new[] / delete[] 4.小结 5.C++语言学习总结 1.遗失的关键字mutable 笔试题: 统计对象中某个 ...

  3. .NET面试题解析(06)-GC与内存管理

      系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 GC作为.NET的重要核心基础,是必须要了解的.本文主要侧重于GC内存管理中的一些关键点,如要要全面深入了 ...

  4. STM32 内存管理实验

    参考原文<STM32F1开发指南> 内存管理简介 内存管理,是指软件运行时对计算机内存资源的分配和使用的技术.最主要的目的是如何高效.快速的分配,并且在适当的时候释放和回收内存资源.内存管 ...

  5. STM32的内存管理

    ref:https://www.cnblogs.com/leo0621/p/9977932.html 这里针对STM32F407芯片+1M外部内存的内存管理!(全篇是个人愚见,如果错误,请不吝指出!) ...

  6. 【STM32】使用SDIO进行SD卡读写,包含文件管理FatFs(八)-认识内存管理

    [STM32]使用SDIO进行SD卡读写,包含文件管理FatFs(一)-初步认识SD卡 [STM32]使用SDIO进行SD卡读写,包含文件管理FatFs(二)-了解SD总线,命令的相关介绍 [STM3 ...

  7. JVM内存管理------GC算法精解(复制算法与标记/整理算法)

    本次LZ和各位分享GC最后两种算法,复制算法以及标记/整理算法.上一章在讲解标记/清除算法时已经提到过,这两种算法都是在此基础上演化而来的,究竟这两种算法优化了之前标记/清除算法的哪些问题呢? 复制算 ...

  8. JVM内存管理--GC算法详解

    标记/清除算法 首先,我们回想一下上一章提到的根搜索算法,它可以解决我们应该回收哪些对象的问题,但是它显然还不能承担垃圾搜集的重任,因为我们在程序(程序也就是指我们运行在JVM上的JAVA程序)运行期 ...

  9. JVM内存管理及GC机制

    一.概述 Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄露 ...

随机推荐

  1. Tomcat环境变量,端口号,编码格式,项目路径,默认页的配置

    Tomcat的配置 1.配置环境变量 新建名为:CATALINA_HOME的系统变量,值为我们安装tomcat的目录 2端口号及编码的配置: 找到tomcat安装目录下的sonf下的server文件, ...

  2. OpenCV中MAT中数据类型的设置(转)

    前言 opencv中很多数据结构为了达到內存使用的最优化,通常都会用它最小上限的空间来分配变量,有的数据结构也会因为图像文件格式的关系而给予适当的变量,因此需要知道它们声明的空间大小来配置适当的变量. ...

  3. charCodeAt() 和charAt()

    charAt() 方法可返回指定位置的字符. charCodeAt() 方法可返回指定位置的字符的 Unicode 编码.这个返回值是 0 - 65535 之间的整数. 方法 charCodeAt() ...

  4. linux下比较两个文本文件的不同——diff命令

    1>Diff命令的功能Linux中Diff命令的功能为逐行比较两个文本文件,列出其不同之处.它对给出的文件进行系统的检查,并显示出两个文件中所有不同的行,不要求事先对文件进行排序. 2>语 ...

  5. Activity四种启动模式与Flag及affinity属性详解

    Activity有四种加载模式:standard(默认).singleTop.singleTask.singleInstance standard:Activity的默认加载模式,即使某个Activi ...

  6. [转]bus error与segment error

    在c程序中,经常会遇到段错误(segment error)和总线错误(bus error),这两种问题出现的原因可能如下 段错误: 对一个NULL指针解引用. 访问程序进程以外的内存空间. 实际上,第 ...

  7. 2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限

    2017-2018-2 『网络对抗技术』Final:Web渗透获取WebShell权限 --------CONTENTS-------- 一.Webshell原理 1.什么是WebShell 2.We ...

  8. JS直接if参数的用法

    经常在JS中见一些代码直接if(参数),然后参数调用的时候是将元素自己传下去.例如下面代码: <body> <input type="text" name=&qu ...

  9. HTTP协议中PUT和POST使用上的区别

    有的观点认为,应该用POST来创建一个资源,用PUT来更新一个资源:有的观点认为,应该用PUT来创建一个资源,用POST来更新一个资源:还有的观点认为可以用PUT和POST中任何一个来做创建或者更新一 ...

  10. 【PE结构】由浅入深PE基础学习-菜鸟手动查询导出表、相对虚拟地址(RVA)与文件偏移地址转换(FOA)

    0 前言 此篇文章想写如何通过工具手查导出表.PE文件代码编程过程中的原理.文笔不是很好,内容也是查阅了很多的资料后整合出来的.希望借此加深对PE文件格式的理解,也希望可以对看雪论坛有所贡献.因为了解 ...