知识卡片

Flink自研内存管理MemorySegment的动机

专业/工作 · 502.b

内容

Flink没有把所有数据都作为普通Java对象堆在JVM堆内存里,而是把序列化后的字节数组写入自己管理的MemorySegment——一种预分配、固定长度(默认32KB)的内存块,是Flink内部最小的内存分配单元。这样设计换来四个好处:减少GC压力(大量数据不再是需要被垃圾回收器扫描的堆对象,而是连续字节块)、避免OOM(内存使用量可控、可预分配)、节省内存空间(省去了Java对象头等额外开销)、支持高效的二进制操作(可以直接在字节层面比较、拷贝,不必先反序列化成对象)。这是一种典型的”用自建的堆外/类堆外内存模型换取可控性能”的工程取舍,本质上是把内存管理的复杂度从JVM通用GC手里接管过来,自己按数据处理场景定制,代价是框架要自己实现一整套内存分配和序列化逻辑。

参考来源

《Flink入门与实战》第5章《数据类型与序列化》