Spark-源码系列-SparkCore-Shuffle 设计-内存管理-TaskMemoryManager
一、概述
TaskiMemoryManger 负责管理单个任务的堆外执行内存和堆内执行内存,Spark 中 Task 的执行内存是通过 TaskMemoryManger 统一管理的,不论是 ShuffleMapTask 还是 ResultTask, Spark 都会生成一个专用的 TaskMemoryManger 对象,然后通过 TaskContext 将 TaskMeroryManger 对象共享给该 task attempt 的所有 MemoryConsumer。 TaskMemoryManger 自建了一套内存页管理机制,并统一对 ON_HEAP
和 OFF_HEAP
内存进行编址,分配和释放。
https://blog.csdn.net/lidongmeng0213/article/details/108865063
https://www.jianshu.com/p/1176b8c637d5
二、内存页管理模块
TaskMemoryManger 实现了一套类似于操作系统内存页管理的机制。
2.1. MemoryLocation
为了统一 ON_HEAP
和 OFF_HEAP
的执行内存,抽象出 MemoryLocation,包含了 obj 对象和 offset 属性,这个类可以用来内存寻址,具体的寻址如下:
- obj 处于堆内内存模式时,数据作为对象存储在 JVM 的堆上,此时的 obj 不为空;堆外内存模式时,数据存储在 JVM 的堆外内存[操作系统内存]中,因而不会在 JVM 中存在对象,所以 obj 为NULL;
- offset 属性主要用来定位数据,处于堆内内存模式时,首先从堆内找到对象 MemoryBlock,然后使用 offset 定位数据的具体位置:处于堆外内存模式时,则直接使用 offset 从堆外内存中定位。
2.2. MemoryBlock
TaskMemoryManger 用 MemoryBlock 表示内存页(page),每个 MemoryBlock 对象就是 page
2.3. MemoryAllocator
通过调用 MemoryManager 和 MemoryAllocator,将逻辑内存的申请&释放与物理内存的分配&释放结合起来。
三、内存申请
四、内存释放
五、内存消费者管理
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Joker!
评论
ValineTwikoo