一、概述

TaskiMemoryManger 负责管理单个任务的堆外执行内存和堆内执行内存,Spark 中 Task 的执行内存是通过 TaskMemoryManger 统一管理的,不论是 ShuffleMapTask 还是 ResultTask, Spark 都会生成一个专用的 TaskMemoryManger 对象,然后通过 TaskContext 将 TaskMeroryManger 对象共享给该 task attempt 的所有 MemoryConsumer。 TaskMemoryManger 自建了一套内存页管理机制,并统一对 ON_HEAPOFF_HEAP 内存进行编址,分配和释放。

https://blog.csdn.net/lidongmeng0213/article/details/108865063

https://www.jianshu.com/p/1176b8c637d5

二、内存页管理模块

TaskMemoryManger 实现了一套类似于操作系统内存页管理的机制。

2.1. MemoryLocation

为了统一 ON_HEAPOFF_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,将逻辑内存的申请&释放与物理内存的分配&释放结合起来。

三、内存申请

四、内存释放

五、内存消费者管理