Flink作业中如何避免垃圾回收暂停?

提问者:帅平 问题分类:面试刷题
Flink作业中如何避免垃圾回收暂停?
2 个回答
赤脚踏两船
赤脚踏两船
具体的优化措施有:
1、减少堆内存依赖​
1、使用 RocksDB 状态后端​:RocksDB 将状态数据存储在堆外内存(Native Memory),显著减少 JVM 堆压力。
env.setStateBackend(new RocksDBStateBackend("hdfs:///checkpoints"));
2、​调整托管内存(Managed Memory)​​:增加用于网络缓冲区和排序的内存占比。
taskmanager.memory.managed.fraction: 0.4  # 托管内存占总内存的40%
taskmanager.memory.managed.size: 2048m    # 或直接指定绝对值
2、精细化内存分配
​明确划分内存区域​:在 flink-conf.yaml 中配置各内存区域大小,避免默认配置导致的溢出。
taskmanager.memory.task.heap.size: 4096m   # Task堆内存
taskmanager.memory.framework.heap.size: 512m # 框架堆内存
taskmanager.memory.jvm-metaspace.size: 256m # Metaspace
3、选择低延迟的GC算法
G1 垃圾回收器​:适合大堆内存(>4GB),平衡吞吐与延迟。
env.java.opts.taskmanager: "-XX:+UseG1GC -XX:MaxGCPauseMillis=50 -XX:G1HeapRegionSize=32m"
ZGC / Shenandoah​:适用于超大堆内存(>32GB)和极低暂停要求(亚秒级)。
env.java.opts.taskmanager: "-XX:+UseZGC -XX:ZAllocationSpikeTolerance=5"
# 或
env.java.opts.taskmanager: "-XX:+UseShenandoahGC -XX:ShenandoahGCMode=iu"
发布于:2个月前 (05-19) IP属地:
剪段光缓缓流淌
剪段光缓缓流淌
4、调增GC参数
1、年轻代优化​:增大年轻代比例,避免过早晋升老年代。
-XX:NewRatio=2          # 年轻代:老年代 = 1:2
-XX:SurvivorRatio=8      # Eden:Survivor = 8:1:1
2、并行化 Full GC​:减少 Full GC 停顿时间(仅 CMS 有效)。
-XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled
5、减少对象分配
1、重用对象​:在 map/flatMap 中复用对象,避免频繁创建新实例。
2、使用基本类型数组​:替代 List<Integer>,使用 int[] 减少盒装类型开销。
发布于:2个月前 (05-19) IP属地:
我来回答