我是Flink新人,最近在看一些flink资源管理机制的知识,有3个内存类型方面的问题想请教大家: 1. Flink的内存类型如下图1所示,其中Heap内存和NonHeap内存由JVM管理,我想问一下Direct内存是否也是由JVM管理?因为我同时也看到过图2所示的内存类型,上面标示的是JVM Direct,但在FLIP102里看到的是属于Outside JVM,所以现在有点困惑。另外,我从相关页面上只看到了Network buffers, Managed memory, Heap的计算方法,但不知道按照图1所示的内存类型,Direct内存和NonHeap是怎么计算分配的?
关于你的几个问题:
Memory)的定义却有很多不同的版本,这应该是导致你困惑的主要原因。让我们先抛开这些名词,本质上 Java 应用使用的内存(不包括 JVM
自身的开销)可以分为三类:
JVM 堆内存:Heap
不在 JVM 堆上但受到 JVM 管理的内存:Direct
完全不受 JVM 管理的内存:Native
Direct 内存是直接映射到 JVM 虚拟机外部的内存空间,但是其用量又受到 JVM 的管理和限制,从这个角度来讲,认为它是 JVM 内存或者非
JVM 内存都是讲得通的。
关于 Off-Heap/Non-Heap,广义上讲只要不是 Heap 内存就可以称为 Non-Heap,但是我们经过实验发现 MXBean 的
Non-Heap 是不包括 Direct,而是由 Code Cache、Metaspace、Compressed Class Space
几个部分组成。FLIP-102 讨论的是 metrics 如何在 WebUI 上展示,Flink metrics 是通过 MXBean
获取的,因此图一展示的 Non-Heap 是与 MXBean 的 Non-Heap 定义的。
的情况。这里的 Direct 指的是 Direct Buffer Pool 而不是 Direct Memory,这两个 Buffer Pool 都是受
-XX:MaxDirectMemorySize 控制的,可以认为都是 Direct Memory 的一部分。
这几个 metrics 加在一起不是 TM 的总内存,一方面是因为 Native 内存没有被算进去(也就是 Cut-off 的主要部分),因为
Native 是不受 JVM 管理的,MXBean 完全不知道它的使用情况。另一方面,JVM 自身的开销也并不是都被覆盖到了,比如对于栈空间,JVM
只能限制每个线程的栈空间有多大,但是不能限制线程的数量,因此总的栈空间大小也是不受控制的,也没有通过 Metric 来体现。
总的来说,JVM 的内存机制是非常复杂的,且并不是每一个部分都能够由用户参数控制的。Flink 1.10
简化了内存模型,目的是让用户不需要去关心这其中的细节,只关注 Flink 各功能模块所需的相关内存大小即可。而目前在 1.10 中的 metric
是比较缺失的无法完全描述 Flink 的内存使用情况,社区提出 FLIP-102 梳理 metrics 及 UI
展示也正是为了解决这个问题。但即便如此,受 JVM 内存机制本身的限制,恐怕也很难做到每个部分都完全匹配到对应的 metrics 上。
类型。MemoryStateBackend/FsStateBackend 用的是 Heap 内存,RocksDBStateBackend 用的是
Native 内存,也就是 1.10 中的 Manage Memory。*来自志愿者整理的FLINK邮件归档
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。