一般是由于flink内存分配的策略以及回收不及时导致的
现在taskmanager当中开启 rest.flamegraph: true
配置JVM dashboard观察gc log
参考教程:
- 替换linux自带的glibc回收器为jmalloc
export MALLOC_MMAP_THRESHOLD_=8192 (大于某个值, 使用mmap方式申请内存,free掉之后会立即还给操作系统,默认128k)
export MALLOC_ARENA_MAX=4 (MALLOC_ARENA_MAX是在效率和内存消耗之间做选择. 使用默认的MALLOC_ARENA_MAX能获得最佳效率, 但是可能消耗更多的内存. 减少MALLOC_ARENA_MAX能减少内存使用, 但是效率可能稍微低一些)
如果替换完后内存没有明显减少 考虑基于G1回收器调优
2.基于G1的调优
G1大对象以及并发GC调优
以4core 8g 4个进程为单位计算
#G1当中大对象的region区域大小,
-XX:G1HeapRegionSize=33554432 (32M)
-XX:InitialHeapSize=524288000 (500M)
# 默认值45,超过这个45%的阈值,开始触发全局标记,
#进而触发mixed gc,注意这个值表示的是:
#老年区已使用空间/整个堆空间
# 压力转移到老年代,强制触发full gc
-XX:InitiatingHeapOccupancyPercent=45
#两次gc的暂停时间间隔
-XX:MaxGCPauseMillis=200 (ms)
-XX:MaxHeapSize=524288000
#GC线程多一些,加快回收
#串行执行的GC线程数
-XX:ParallelGCThreads=8
#并发执行的线程数
-XX:ConcGCThreads=16
# 去除内联编译缓存
-XX:ReservedCodeCacheSize=268435456(256M)
-XX:-TieredCompilation
-XX:+UseCodeCacheFlushing
#关闭指针压缩 UseCompressedOops会使用32-bit的offset
#来代表java object的引用,
#而UseCompressedClassPointers则使用32-bit的offset来
#代表64-bit进程中的class pointer;
#可以使用CompressedClassSpaceSize来设置这块的空间大小
-XX:+UseCompressedClassPointers
-XX:+UseCompressedOops
-XX:CompressedClassSpaceSize=260046848(248M)
#打印GC参数
-XX:+PrintGC
-XX:+PrintGCTimeStamps
-XX:+UseG1GC