Spark所有的运行服务都是JVM进程。内存分为堆内内存和堆外内存,分别是JVM内部管理和操作系统内存。
在Spark-1.6版本以后使用动态内存管理:堆内存如下图所示:

堆外内存如下图所示:

箭头表示可以上下浮动,动态占用(借用)。使用spark.storage.storageFraction参数设置内存区域范围。内存空间不足时(是指不足以放下一个Block)则存储到磁盘。Execution内存被Storage占用可以让其存入磁盘,然后归还所借空间。Storage内存空间被Execution占用后无法让对方归还,因为需要考虑Shuffle过程中的很多因素,较复杂。
Other中的数据块Block(Partition)中的数据(Record)是不连续的,向Storage中存储(Persist)后,在Storage中一个Partition(Block)是连续的了(开辟一个空间存放),这个过程称为Unroll。Storage中的空间不够了会按照LRU的方式删除旧的数据。Execution内存区域主要存储Shuffle过程的相关数据,包括ShuffleWrite(也就是Map端,采用普通或Tungsten排序方式,分别采用ExternalSorter和ShuffleExternalSorter,第二种将堆内堆外混合使用,上层再建立一层逻辑,类似内存页,页码和偏移量,管理空间)和ShuffleRead(Reduce端,交给Aggregator处理,占用堆内内存)。
在Executor和Driver中都有管理数据的BlockManager,Driver还有BlockManagerMaster。一个BlockManager中有DiskStore和MemoryStore,其中还有BlockTransferService负责和其他Executor通讯获取数据。BlockManager会向Driver的BlockManagerMaster注册和通讯,BlockManagerMaster会存储BlockManager的存放数据的信息。在Executor上执行任务并不获取广播变量,使用时BlockManager才去Driver的BlockManager拉取。