Overview
Review
本文主要介绍了 flink 内部的内存模型。
传统的基于jvm执行的框架服务,在对data object 进行操作的时候,大部分是直接放在堆内部,这就容易导致一些问题,一个是内存是有限的,另外gc的时间也会随着内存变大而逐渐增长,内存无法申请到的时候会直接导致OutOfMemoryError,导致服务进程直接挂掉。纯粹靠经验以及process的data本身特性进行维护,是不可靠的,尤其是随着平台切换。
那么flink是如何做的呢?
flink首先申请堆的70%的内存,直接构建出一个long-lived 对象,用来存放二进制的data object,我们称这里的最小单元为MemorySegment,它的实现是基于java byte array的,这样一个long-lived segments 称之为 management memory。
它的生命周期是整个进程的生命周期,不会被回收,所有data object 的新增以及删除,都不是针对 segment本身的,而是对其内部的操作,这也就是说实际上memory segment是 reusable的。
因为 memory segment存放的是 二进制,所以不可避免的需要实现序列化。flink 将每个data type 伴随着一个 typeinformation,支持嵌套的序列化方式。
flink的操作也是基于 binary data的,如何操作在文中已经展示,后续单独文章说明。
网友评论