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开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄露 ...
随机推荐
- Tomcat环境变量,端口号,编码格式,项目路径,默认页的配置
Tomcat的配置 1.配置环境变量 新建名为:CATALINA_HOME的系统变量,值为我们安装tomcat的目录 2端口号及编码的配置: 找到tomcat安装目录下的sonf下的server文件, ...
- OpenCV中MAT中数据类型的设置(转)
前言 opencv中很多数据结构为了达到內存使用的最优化,通常都会用它最小上限的空间来分配变量,有的数据结构也会因为图像文件格式的关系而给予适当的变量,因此需要知道它们声明的空间大小来配置适当的变量. ...
- charCodeAt() 和charAt()
charAt() 方法可返回指定位置的字符. charCodeAt() 方法可返回指定位置的字符的 Unicode 编码.这个返回值是 0 - 65535 之间的整数. 方法 charCodeAt() ...
- linux下比较两个文本文件的不同——diff命令
1>Diff命令的功能Linux中Diff命令的功能为逐行比较两个文本文件,列出其不同之处.它对给出的文件进行系统的检查,并显示出两个文件中所有不同的行,不要求事先对文件进行排序. 2>语 ...
- Activity四种启动模式与Flag及affinity属性详解
Activity有四种加载模式:standard(默认).singleTop.singleTask.singleInstance standard:Activity的默认加载模式,即使某个Activi ...
- [转]bus error与segment error
在c程序中,经常会遇到段错误(segment error)和总线错误(bus error),这两种问题出现的原因可能如下 段错误: 对一个NULL指针解引用. 访问程序进程以外的内存空间. 实际上,第 ...
- 2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限
2017-2018-2 『网络对抗技术』Final:Web渗透获取WebShell权限 --------CONTENTS-------- 一.Webshell原理 1.什么是WebShell 2.We ...
- JS直接if参数的用法
经常在JS中见一些代码直接if(参数),然后参数调用的时候是将元素自己传下去.例如下面代码: <body> <input type="text" name=&qu ...
- HTTP协议中PUT和POST使用上的区别
有的观点认为,应该用POST来创建一个资源,用PUT来更新一个资源:有的观点认为,应该用PUT来创建一个资源,用POST来更新一个资源:还有的观点认为可以用PUT和POST中任何一个来做创建或者更新一 ...
- 【PE结构】由浅入深PE基础学习-菜鸟手动查询导出表、相对虚拟地址(RVA)与文件偏移地址转换(FOA)
0 前言 此篇文章想写如何通过工具手查导出表.PE文件代码编程过程中的原理.文笔不是很好,内容也是查阅了很多的资料后整合出来的.希望借此加深对PE文件格式的理解,也希望可以对看雪论坛有所贡献.因为了解 ...