Flink的内存管理器管理着用于排序、散列和缓存所需的内存。内存以相等大小的(Segments)表示,称为内存页。操作器通过请求多个内存页来分配内存。在Flink中,内存又分为堆内存和非堆内存。至于是去申请什么类型的内存,这里有相关的参数去配置。
内存管理器可以预先分配所有内存,或者按需分配内存。在前者中,内存将从开始就被占用和保留,这意味着在请求内存时不能出现OutOfMemoryError
,释放的内存也将返回到内存管理器的池中。按需分配是指内存管理器只跟踪当前分配了多少内存段(仅记账)。释放内存页不会将其添加到池中,而是让垃圾收集器重新声明它。
Flink作为一个高效的流框架,为了避免JVM的固有缺陷(java对象存储密度低,FGC影响吞吐和响应等),必然走上自主管理内存的道路。
这个MemorySegment
就是Flink的内存抽象。默认情况下,一个MemorySegment可以被看做是一个32kb大的内存块的抽象。