Flink并不是将大量对象存在堆上,而是将对象都序列化到一个预分配的内存块上。此外,Flink
大量的使用了堆外内存。如果需要处理的数据超出了内存限制,则会将部分数据 存储到硬盘上。Flink
为了直接操作二进制数据实现了自己的序列化框架。理论上
Flink
的。
内存管理分为三部分:
- Network Buffers:这个是在 TaskManager 启动的时候分配的,这是一组用于缓存网络数据的内存,每个块是32K,默认分配 2048个,可以通过“taskmanager.network.numberOfBuffers” 修改。
- Memory Manage pool:大量的 Memory Segment 块,用于运行时的算法(Sort/Join/Shuffle 等),这部分启动的时候就会分配。
- User Code:这部分是除了 Memory Manager 之外的内存用于 User code 和 TaskManager 本身的数据结构。