这一部分是我在网上找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. PHP5.5+Nginx1.9

    1. 安装Nginx:http://www.cnblogs.com/vurtne-lu/p/7010065.html 2. 编译安装 [root@zabbix opt]# wget http://cn ...

  2. 用 Lua 控制 MIDI 合成器来播放自定义格式乐谱

    用 Lua 控制 MIDI 合成器来播放自定义格式乐谱 作者: FreeBlues 最新: https://www.cnblogs.com/freeblues/p/9936844.html 说明: 本 ...

  3. 淘淘商城之springmvc和mybatis整合

    一.需求 使用springmvc和mybatis完成商品列表查询 二.整合思路 springmvc+mybaits的系统架构: 第一步:整合dao层 mybatis和spring整合,通过spring ...

  4. UE4的AI学习(1)——基本概念

    AI学习当中,不学习行为树基本概念就不能明白具体实例中的操作意义,但是没有经过具体实例实验,又觉得基本概念抽象难以理解.建议先泛读(1)(2)后再对具体的细节进行死磕,能较深的理解行为树的具体概念.第 ...

  5. luogu P2331 [SCOI2005]最大子矩阵

    传送门 \[\huge\mathit{warning}\] \[\small\text{以下说明文字高能,请心脏病,,,,,,人士谨慎观看,请未成年人在家长陪同下观看}\] 皮这一下很开心 其实是代码 ...

  6. mysql 案例 ~ 瘦身mysql系列(1)

    一 简介:这一系列我们要进行如何瘦身mysql 二 目的:通过提高CPU利用率和节约成本,降低数据库容量及I/O负载,从而使数据吞吐率得到显著提高 三 方法: 利用innodb的COMPRESSED ...

  7. Remaiten-一个以路由器和IoT设备为目标的Linux bot

    Remaiten-一个以路由器和IoT设备为目标的Linux bot ESET的研究人员正在积极地检测以嵌入式系统为攻击目标的木马,受影响的有路由器,网关和无线访问点.近期,我们已经发现了一个相关的b ...

  8. Linux的7个运行级别

    0:关机 1:单用户(找回丢失密码)此模式下所有用户不需要密码即可登录,可用于重置密码 2:多用户状态没有网络服务 3:多用户状态有网络服务 ★ 4:系统未使用保留给用户 5:图形界面 ★ 6:系统重 ...

  9. 使用neo4j-import工具导入数据

    从Neo4j2.2版本开始,系统就自带了一个大数据量的导入工具:neo4j-import,可支持并行.可扩展的大规模csv数据导入(本例版本为:3.4.7版本) 1.前提条件 关闭neo4j 无法在原 ...

  10. SCons: 替代 make 和 makefile 及 javac 的极好用的c、c++、java 构建工具

    http://scons.org/ https://www.ibm.com/developerworks/cn/linux/l-cn-scons/index.html 后附:另外,WAF是一个基于sc ...