PartitionAlloc是Blink模块的内存分配器,并为此在性能和安全性方面做了专门的优化,其目的就是为Blink中的所有对象分配内存空间(另外一个更利于与垃圾回收机制结合的OilPan方案也正在实施中)。

PartitionAlloc主要包含四个分区,每个分区都是一个包含特定类型对象的堆空间;因此PartitionAlloc将按照所分配对象的类型在以下四个分区中分配空间:

  • Buffer分区:主要分配变长对象或者是内容可能会被用户脚本篡改的对象,如Vector、HashTable、ArrayBufferContent、String等容器类对象;
  • FastMalloc分区:主要分配除其他三种类型之外的比如被标记为USING_FAST_MALLOC的类对象,Blink中大量功能逻辑的内部对象都归于此分区;
  • Node分区(之前版本叫modelobject分区):主要分配dom节点对象,通过重写Node.new/delete运算符实现
  • LayoutObject分区:主要分配layou相关对象,如LayoutObject、PaintLayer、双向字体BidiCharacterRun等对象

以上每个分区都持有多种/个桶(bucket),每个桶又是一块包含同等大小对象的区域,因此每个对象分配的空间大小都被向上对其到最小桶大小;例如需要为一个128字节的对象分配内存空间,而这个分区只有三种大小 的桶:64B、256B、1024B,那么这个对象就需要被填充至256字节分配于第二个桶内。   实际上,对于以上四种分区:Node分区和LayoutObject分区均有能囊括一定范围大小的对象N*sizeof(void *),其中(N=1,2,...,N_max),不同大小的对象均能分配到对应的桶内(不需要额外填充对其);而Buffer分区和FastMalloc分区则不同,它们都需要支持任意字节大小的对象,出于性能方面的考虑,当然不能为任意大小的对象都创建相应的桶,这就需要选择合适的桶并将对象额外填充部分字节将其填充分配到合适的桶内(这里桶大小以最坏情况下允许10%空间浪费进行选择);此外对于大小超过1MB的大对象则直接以内存映射的方式进行分配。

从内部实现上四种分区分配器对象定义如下:

实际使用时则都需要指明分配器对象进行分配和回收(如下是Buffer和Node分区的申请和释放用法举例):

性能方面优化措施:

针对每种分配器的用途采取不同的优化方案,由于Node分区和LayoutObject分区对象都只能在renderer主线程进行分配,因此这两种分配器对象的分配就不需要加锁操作;而Buffer分区和FastMalloc分区对象虽然涉及多线程分配(如Renderer主线程、Compositor线程、HTMLParser线程等),但由于Blink中这几种线程争用问题则非常少,因此采用了spinlock加锁操作;另外,之所以要分成这四个分区,性能方面的考虑也是主要因素,这样更利于分支预测、路径最小化、高效内联等措施以提升性能。

安全因素的考虑也是PartitionAlloc最重要的目标之一,这里利用虚拟地址空间来达到安全加固的目的:

不同的分区存在于隔离的地址空间;当某个分区内存页上所有对象都被释放掉之后,其物理内存归还于系统后,但其地址空间仍被此分区保留,这样就保证了此地址空间只能被此分区重用,从而避免了信息泄露;此外,之所以将String、Vector等对象置于Buffer分区,是因为这些对象的长度或内容更易于被用户脚本篡改。

Blink内存分配器PartitionAlloc相关推荐

  1. 内存分配器设计的演进

    文章目录 栈内存空间是否够用 系统调用申请内存 最简单的内存分配器实现 -- bump allocator 可扩容的 Bump alloactor 通过free-list 管理的 allocator ...

  2. mysql 自动管理内存_MySQL内存管理,内存分配器和操作系统

    导读 作者:Sveta Smirnova 翻译:郑志江 校对:徐晨亮 原文 :MySQL Memory Management, Memory Allocators and Operating Syst ...

  3. 内存分配器memblock【转】

    转自:http://blog.csdn.net/kickxxx/article/details/54710243 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 背景 Data ...

  4. slab 内存分配器介绍(一)

    原文引用地址:https://www.ibm.com/developerworks/cn/linux/l-linux-slab-allocator/ 动态内存管理 内存管理的目标是提供一种方法,为实现 ...

  5. STL内存分配器:allocator

    一.STL泛型容器 与 内存管理 1.1 STL泛型容器中隐藏了内存管理工作 STL提供了很多泛型容器,如vector,list,map等.程序员使用时之关心如何存放对象,不用关心如何管理内存. 容器 ...

  6. 内核中的几种内存分配器

    内存管理是内核是最复杂同时也是最重要的一部分,其中就涉及到了多种内存分配器,如果内核初始化阶段使用的bootmem分配器,分配大块内存的伙伴系统,以及其分配较小块内存的slab.slub和slob分配 ...

  7. [CNT]关于自己的一个小小的slab内存分配器

    引言:应用级别的内存分配器的作用主要在于减少malloc函数的调用,降低系统的内存碎片.作为高性能的服务器,一般都会有自己的内存分配方案.slab作为一款Linux内核的经典内存分配方式,应用在很多的 ...

  8. MySQL内存管理,内存分配器和操作系统

    原文 :MySQL Memory Management, Memory Allocators and Operating System 本文涉及链接在文末展示 When users experienc ...

  9. Linux glibc内存管理:用户态内存分配器——ptmalloc实现原理

    文章目录 ptmalloc 设计假设 Arena Chunk Bins 内存分配.释放流程 总结 C++ STL : SGI-STL空间配置器源码剖析 Linux 内存管理 | 物理内存管理:物理内存 ...

最新文章

  1. Python Qt GUI设计:窗口布局管理方法【基础】(基础篇—5)
  2. C语言,统计0~9出现次数。_只愿与一人十指紧扣_新浪博客
  3. 实战struts2——用户登录
  4. kafka 脚本发送_Kafka笔记归纳(第五部分:一致性保证,消息重复消费场景及解决方式)...
  5. Serial Port接收数据完整性要求
  6. Centos 7 更改系统语言为中文
  7. 计算机网络系统工程技术交底,技术交底内容大全
  8. c excel批量导入mysql数据库_Excel批量导入数据库
  9. 代码的执行效率(3)--缓存与局部性 摘自赵劼老师的博客
  10. poj3414 Pots
  11. 软考资料-软件设计师
  12. Cadence Allegro 高亮功能的使用技巧图文教程
  13. 解决sql插入中文问题
  14. pythonopencv直方图均衡化_OpenCV-Python教程(10、直方图均衡化)
  15. Unity序列化——Assets序列化
  16. 私有CA搭建并将HTTPS应用于Tomcat、Springboot
  17. 一个数据存取类的代码,请高手帮忙分析和指定是否有误!
  18. 使用xpath爬取腾讯招聘python岗位信息
  19. oos的上传和下载2
  20. java计算机毕业设计汽车客运站票务管理系统源代码+数据库+系统+lw文档

热门文章

  1. 盘点:2017年我国科技创新十大里程碑事件
  2. 计算机人工智能学院院徽,关于公布信息工程学院(人工智能学院)院徽院训征集结果的通知...
  3. Android RecyclerView 使用方法:垂直、横向、瀑布流
  4. SystemVerilog HVL:面向对象编程(Object Oriented Programming, OOP)
  5. flex布局实现div内容垂直居中
  6. 用 Node.js 写一个多人游戏服务器引擎
  7. 循环神经网络(RNN)与长短期记忆网络(LSTM)讲解
  8. 批量剪辑视频的软件视频批量剪辑软件如何剪辑
  9. 【狮子数学】chapter2-04-泰勒展开
  10. 扫地机器人朋友圈文案_扫地机发朋友圈说说