Chakra GC内存管理(未完)
这一部分是我在网上找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和对应的bufferLargeObjectHeader
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内存管理(未完)的更多相关文章
- 一文了解.Net的CLR、GC内存管理
一文了解.Net的CLR.GC内存管理 微软官方文档对内存管理和CLR的概述 什么是托管代码? 托管代码就是执行过程交由运行时管理的代码. 在这种情况下,相关的运行时称为公共语言运行时 (CLR),不 ...
- C++解析(31):自定义内存管理(完)
0.目录 1.遗失的关键字mutable 2.new / delete 3.new[] / delete[] 4.小结 5.C++语言学习总结 1.遗失的关键字mutable 笔试题: 统计对象中某个 ...
- .NET面试题解析(06)-GC与内存管理
系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 GC作为.NET的重要核心基础,是必须要了解的.本文主要侧重于GC内存管理中的一些关键点,如要要全面深入了 ...
- STM32 内存管理实验
参考原文<STM32F1开发指南> 内存管理简介 内存管理,是指软件运行时对计算机内存资源的分配和使用的技术.最主要的目的是如何高效.快速的分配,并且在适当的时候释放和回收内存资源.内存管 ...
- STM32的内存管理
ref:https://www.cnblogs.com/leo0621/p/9977932.html 这里针对STM32F407芯片+1M外部内存的内存管理!(全篇是个人愚见,如果错误,请不吝指出!) ...
- 【STM32】使用SDIO进行SD卡读写,包含文件管理FatFs(八)-认识内存管理
[STM32]使用SDIO进行SD卡读写,包含文件管理FatFs(一)-初步认识SD卡 [STM32]使用SDIO进行SD卡读写,包含文件管理FatFs(二)-了解SD总线,命令的相关介绍 [STM3 ...
- JVM内存管理------GC算法精解(复制算法与标记/整理算法)
本次LZ和各位分享GC最后两种算法,复制算法以及标记/整理算法.上一章在讲解标记/清除算法时已经提到过,这两种算法都是在此基础上演化而来的,究竟这两种算法优化了之前标记/清除算法的哪些问题呢? 复制算 ...
- JVM内存管理--GC算法详解
标记/清除算法 首先,我们回想一下上一章提到的根搜索算法,它可以解决我们应该回收哪些对象的问题,但是它显然还不能承担垃圾搜集的重任,因为我们在程序(程序也就是指我们运行在JVM上的JAVA程序)运行期 ...
- JVM内存管理及GC机制
一.概述 Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄露 ...
随机推荐
- Uva439:BFS题目总结
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <cstring> #include <cstd ...
- logback异步输出日志(生产者消费者模型),并非批量写入日志。
一直对logback异步输出日志误解为异步批量写入日志. 今天看了源代码. 首先logback的异步日志是如何配置的: <!-- 管理端用户行为日志异步输出,异步的log片段必须在同步段后面,否 ...
- 跨越VLAN
跨越VLAN VLAN(Virtual Local Area Network),是基于以太网交互技术构建的虚拟网络,既可以将同一物理网络划分为多个VLAN,也可以跨越物理网络障碍,将不同于子网中的用户 ...
- Oracle——环比增长率
首先,了解什么是:环比增长率? 环比增长率=(本期数-上期数)÷上期数×100% 如:2014年2月的工资为:5000,2014年1月的工资为4000,则2月份的环比增长率为: (5000-4000) ...
- 第5月第7天 php slim
1. <?php require 'Slim/Slim.php'; require 'DBManagement.php'; \Slim\Slim::registerAutoloader(); $ ...
- D - 文理分科 (网络流->最小割)
题目链接:https://cn.vjudge.net/contest/281959#problem/D 题目大意:中文题目 具体思路:我们需要求出最大的满意值,从另一方面想,我们可以求出总的满意值,然 ...
- K - Find them, Catch them POJ - 1703 (带权并查集)
题目链接: K - Find them, Catch them POJ - 1703 题目大意:警方决定捣毁两大犯罪团伙:龙帮和蛇帮,显然一个帮派至少有一人.该城有N个罪犯,编号从1至N(N<= ...
- linux相关设置
mysql开机自启: [root@workstudio system]# systemctl enable mysqld
- SpringBoot2.x使用Dev-tool热部署
SpringBoot2.x使用Dev-tool热部署 为什么使用热部署? 当修改某些文件内容如配置文件时,我们需要重新启动服务器,比较麻烦,需要一个工具来进行检测是否修改.热加载可以检测到修改的部分, ...
- 2017-2018-2 165X 『Java程序设计』课程每周成绩公布
2017-2018-2 165X 『Java程序设计』课程 每周成绩公布 本博客将跟随教学进度不定期更新,每次更新后将在课程群公布.如对成绩有疑问,请于公布成绩后的1天之内联系助教,进行审核确认. - ...