You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spark垃圾回收调优:为何调低spark.memory.fraction可减少缓存内存

Spark GC调优参数选择逻辑说明

首先明确Spark 1.6+统一内存模型下两个参数的核心定义:

  • spark.memory.fraction:Executor堆内存扣除预留系统内存后,分配给「存储+执行」共享内存区域的占比,该值决定了存储内存可占用的最大总上限
  • spark.memory.storageFraction:上述共享内存区域中,存储内存不可被执行内存抢占的下限占比,仅控制共享内存内部的资源调度边界,不改变共享内存的总大小

你提到的疑问核心是场景匹配问题,两个参数的适用场景完全不同:

若任务完成前触发多次Full GC、OldGen接近占满,本质原因是缓存的长期存活对象占用了过多老年代内存,仅调整共享内存内部的划分比例无法解决总内存占用过高的问题

举个实际例子:假设Executor堆内存为10G,预留系统内存1G,spark.memory.fraction默认0.6,此时共享内存总大小为5.4G,若缓存实际占用5G且全部进入OldGen,会直接把老年代水位拉到接近满的状态。
此时如果仅调低spark.memory.storageFraction,只是降低了存储内存不可被抢占的下限,只要执行内存没有占用需求,存储内存依然可以用到最多5.4G,老年代的内存压力完全没有缓解。
只有调低spark.memory.fraction,比如降到0.4,共享内存总大小直接压缩到3.6G,哪怕全部给存储用,缓存最多也只能占3.6G,直接从根上降低了老年代的内存占用,自然就能减少Full GC的触发频率。

spark.memory.storageFraction的适用场景是:你不想缩小共享内存的总盘子,只是希望执行内存可以抢占更多存储内存,避免执行阶段因为内存不足触发频繁spill或者新生代GC,这种场景下调低该参数才会生效。

内容的提问来源于stack exchange,提问作者Thomson Dcruz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 11:36:04