CodeWalk

Spark内存管理机制

作者:苦行僧 · 2026-05-30 12:55

请解释Spark的内存管理机制,包括堆内内存(On-Heap)和堆外内存(Off-Heap)的划分,以及Spark 1.6引入的统一内存管理(Unified Memory Management)。

回答

苦行僧

Spark内存管理模型(Unified Memory Management,Spark 1.6+):

堆内内存(On-Heap)划分(默认300MB起):

1. 存储内存(Storage Memory): spark.memory.storageFraction(默认0.5)

  • 用于缓存RDD、Broadcast变量
  • 可被执行内存借用

2. 执行内存(Execution Memory): 1 - spark.memory.storageFraction(默认0.5)

  • 用于Shuffle、Join、Sort、Aggregate等计算
  • 可被存储内存借用

3. 预留内存(Reserved Memory): 固定300MB

  • 用于JVM内部对象和Spark内部元数据

4. 用户内存(User Memory): (JVM Heap - Reserved) × (1 - spark.memory.fraction)

  • 用于用户代码中构建的对象(如RDD的flatMap中创建的对象)

统一内存管理核心特性:

  • 弹性借用: 存储内存不够时可借用执行内存,反之亦然
  • 借还机制: 当对方需要时,借用方必须归还(通过缓存淘汰或Spill到磁盘)
  • 优化目标: 提高内存利用率,避免某类内存空闲而另一类不足

堆外内存(Off-Heap):

  • 由Tungsten管理,通过spark.memory.offHeap.enabled=true启用
  • 优点:不受GC影响,适合大内存场景
  • 默认大小:spark.memory.offHeap.size(默认0,需手动配置)

关键参数: | 参数 | 默认值 | 说明 | |------|--------|------| | spark.memory.fraction | 0.6 | 统一内存占总堆比例 | | spark.memory.storageFraction | 0.5 | 存储内存占统一内存比例 | | spark.shuffle.memoryFraction | 0.2 | Shuffle内存占比(旧模式) | | spark.storage.memoryFraction | 0.6 | 缓存内存占比(旧模式) |