CodeWalk

Spark内存管理机制详解

作者:我还是少年 · 2026-05-30 12:55

请详细介绍Spark的内存模型,包括堆内内存(On-Heap)和堆外内存(Off-Heap)的划分,各区域的作用及配置参数。

回答

我还是少年

Spark内存分为堆内和堆外两大部分:

一、堆内内存(On-Heap):

  • 执行内存(Execution Memory):Shuffle、Join、Sort、Aggregation等计算使用,spark.executor.memory×spark.memory.fraction×spark.memory.storageFraction
  • 存储内存(Storage Memory):缓存RDD/Broadcast变量/累加器
  • 用户内存(User Memory):用户代码和UDF中的对象,spark.executor.memory×(1-spark.memory.fraction)
  • 预留内存(Reserved Memory):固定300MB

二、统一内存管理(Unified Memory,Spark 1.6+):

  • 执行内存和存储内存可以互相抢占(动态占用)
  • 存储内存空闲时执行内存可借用,反之亦然
  • 但执行内存被借走时,存储内存必须强制逐出(Evict)归还

三、堆外内存(Off-Heap):

  • spark.memory.offHeap.enabled=true
  • spark.memory.offHeap.size指定大小
  • 优点:减少GC压力、可序列化数据直接操作
  • 缺点:必须手动管理内存,序列化/反序列化有开销

关键参数:

  • spark.memory.fraction=0.6:执行+存储占总堆的比例
  • spark.memory.storageFraction=0.5:存储占执行+存储区域的比例(初始边界)
  • 计算:执行内存=(0.6×0.5)×堆=0.3堆,存储也一样

Spark 3.0+ 引入spark.sql.adaptive.localShuffleReader.enabled进一步优化内存