谷歌将采用PartitionAlloc FastMalloc技术优化Chrome内存占用

根据Windows Latest的一份报告,Chrome工程师将会使用“PartitionAlloc FastMalloc”功能来增强Chrome的RAM管理,如果它确实起作用的话,应该能看到Chrome未来大幅改进内存占用的问题。

由于Chrome浏览器占用大量RAM,最近因此而声名狼藉,但根据最新的统计数据,Chrome浏览器占有率为69.25%,Firefox仅占7.22%,微软的新Edge占9.71%。

说到Edge,微软的浏览器现在使用与Chrome相同的Chromium引擎,并且微软一直在努力通过称为“SegmentHeap”的功能来降低其浏览器的RAM占用,微软声称通过该技术让Edge中内存使用量降低了27%。但Segment Heap会造成CPU密集型进程的 “性能倒退”,因此谷歌不打算采用同样的技术。

那谷歌倡导的“PartitionAlloc FastMalloc”是什么呢?

PartitionAlloc有四个分区。分区是包含某些类型的对象的堆。具体来说,PartitionAlloc根据对象的类型在以下四个分区中的任何一个上分配对象。

  • 节点分区:用于分配节点的分区。
  • LayoutObject分区:分配LayoutObject的分区。
  • 缓冲区分区:用于分配对象的分区,这些对象很可能会被用户脚本利用其长度和/或内容。具体来说,Vector,HashTables,ArrayBufferContents和Strings在Buffer分区上分配。
  • FastMalloc分区:分配所有其他对象的分区。标有USING_FAST_MALLOC的对象在FastMalloc分区上分配。

每个分区都包含多个存储桶。存储桶是分区中包含相似大小对象的区域。每个对象分配必须与最接近的存储桶大小对齐。例如,如果一个分区具有三个分别为64个字节,256个字节和1024个字节的存储桶,则将128个字节的对象四舍五入为256个字节并分配给第二个存储桶。

Node分区和LayoutObject分区具有所有N * sizeof(void *)(N = 1,2,…,N_max)的存储桶。这意味着不需要额外的填充来分配Node对象。不同大小的Node对象分配在不同的存储桶中。

Buffer分区和FastMalloc分区有很多存储桶。它们支持任意大小的分配,但可以添加填充以使分配与最接近的存储桶大小对齐。选择存储桶大小可将最坏情况的内存开销保持在10%以下。

通过直接内存映射可以实现较大的分配(> 1 MB)。

“PartitionAlloc FastMalloc”性能如何

在Node分区和LayoutObject分区上进行分配时,PartitionAlloc不会获得锁定,因为可以确保Node和LayoutObjects仅由主线程分配。

在Buffer分区和FastMalloc分区上分配时,PartitionAlloc获取一个锁。PartitionAlloc使用旋转锁,因为线程争用在Blink中很少见。

PartitionAlloc设计为在快速路径中非常快。分配和重新分配的快速路径仅需要两个(合理可预测的)分支。快速路径中的操作数量被最小化,从而导致内联的可能性。

具有Nodes和LayoutObjects的专用分区有助于改善缓存局部性,从而提高性能。

期待Chrome吧,这个性能出众、当前用户最多的浏览器,不要再让用户吐槽内存占用过高的问题了……


发表评论