Flink的内存分为堆外和堆内内存。
假设一个任务的TaskManager的任务配置了4G,内存模型如下图所示。其中托管内存(1.34G)和网络内存(343M)基本没用,那就可以把托管内存和网络内存设置为最小值64M,那就可以省出1340-64+343-64=1555M, 这部分内存就会加到堆内存上面去,此时堆内存的容量就变成了3G,而仅仅使用了1G,完全可以省出1-1.5G出来。
堆内内存:
FreamworkHeap:框架使用的堆内存(默认固定128M)
TaskHeap:任务使用的堆内存
堆外内存:
ManagedMemory:托管内存,默认情况分配40%,但是不一定使用,是内存治理的重灾区。托管内存的用处有:
- 批处理算法,比如排序,hashjoin等。
- RocksDB StateBackend,Flink 只会预留一部分空间并扣除预算,但是不介入实际内存分配
- PyFlink, 与 JNI 类似,在与 Python 进程交互的过程中,也会用到一部分托管内存。
Freamwork Off-Heap:框架使用的堆外内存,(默认固定128M)
DirectMemory:
- 框架自身(taskmanager.memory.framework.off-heap.size 参数,默认 128M,例如 Sort-Merge Shuffle 算法所需的内存)
- 用户任务(taskmanager.memory.task.off-heap.size 参数,默认设为 0)
- Netty 对 Network Buffer 的网络传输(taskmanager.memory.network.fraction 等参数,默认 0.1 即 10% 的 Flink 总内存)。
JVM Metaspace:JVM Metaspace 主要保存了加载的类和方法的元数据,Flink 配置的参数是 taskmanager.memory.jvm-metaspace.size,默认大小为 256M,JVM 参数是 -XX:MaxMetaspaceSize.
JVM OverHead:JVM运行时开销,除了上述描述的内存区域外,JVM 自己还有一小块 “自留地”,用来存放线程栈、编译的代码缓存、JNI 调用的库所分配的内存等等,Flink 配置参数是 taskmanager.memory.jvm-overhead.fraction,默认是 JVM 总内存的 10%。
评论 (0)