Flink内存模型
一、内存布局
1、直观图
2、树状图
二、内存解释
1、Flink使用的内存
(1)JVM堆上内存
说明:堆上内存管理序列化之后的数据,如果需要处理的数据超出了内存限制,则会将部分数据存储到硬盘上。堆上内存在写磁盘或网络传输时至少需要一次内存复制。
a.框架堆上内存Framework Heap Memory
Flink框架本身所使用的内存,即TaskManager本身所占用的堆上内存,不计入Slot资源中
配置参数:taskmanager.memory.framework.heap.size=128MB,默认值128MB
b.Task堆上内存Task Heap Memory
Task执行用户代码时所使用的堆上内存
配置参数:taskmanager.memory.task.heap.size
(2)JVM堆外内存
说明:使用堆外内存,可以将大量的数据保存在堆外,极大地减小堆内存,避免GC和内存溢出的问题。堆外内存在写磁盘或网络传输时是零拷贝。堆外内存是进程间共享的。即使JVM进程奔溃也不会丢失数据。堆上内存的使用、监控、调式简单,堆外内存出现问题后的诊断则较为复杂
a.框架堆外内存Framework Off-Heap Memory
Flink框架本身所使用的内存,即TaskManager本身所占用的堆外内存,不计入Slot资源。
配置参数:taskmanager.memory.framework.off-heap.size=128MB,默认值128MB
b.Task堆外内存Task Off-heap Memory
Task执行用户代码时所使用的堆外内存
配置参数:taskmanager.memory.task.off-heap.size=0,默认值为0
c.网络缓冲内存Network Memory
网络数据交换所使用的堆外内存大小,如网络数据交换缓冲区(Network Buffter)
配置参数:taskmanager.memory.network.[64/1024/0.1](min/max/fraction),默认min=64MB,max=1GB,fraction=0.1
d.堆外托管内存Managed Memory
Flink管理的堆外内存
配置参数:taskmanager.memory.managed.[size|fraction],默认值fraction=0.4
2、JVM本身使用的内存
(1)JVM元空间
JVM元空间所使用的内存
配置参数:taskmanager.memory.jvm-metaspace=96m,默认值96MB
(2)JVM执行开销
JVM在执行时自身所需要的内容,包括线程堆栈、IO、编译缓存等所使用的内存。
配置参数:taskmanager.memory.jvm-overhead=[min/max/fraction],默认min=192MB,max=1GB,fraction=01
3、总体内存
(1)Flink使用内存
Flink使用的内存包括Flink使用的堆上、堆外内存。
配置参数:taskmanager.memory.flink.size
(2)进程使用内存
整个进程所使用的内存,包括Flink使用的内存和JVM使用的内存。
配置参数:taskmanager.memory.process.size
JVM内存控制参数:
JVM堆上内存,使用-Xmx和-Xms控制
JVM直接内存,使用-XX:MaxDirectMemory控制。对于托管内存的,使用Unsafe.allocateMemory()申请,不受该参数控制
JVM Metaspace使用-XX:MaxMetaspaceSize控制