2 个回答
具体的优化措施有:
1、减少堆内存依赖
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属地:
我来回答
您需要 登录 后回答此问题!