Flink中MemorySegment用来管理内存,其是一个抽象类,具体实现有HeapMemorySegment和HybirdMemorySegment。

protected static final long BYTE_ARRAY_BASE_OFFSET = UNSAFE.arrayBaseOffset(byte[].class);

BYTE_ARRAY_BASE_OFFSET是byte数组的相对偏移量,当存储为堆内内存的时候,在一直当前MemorySegment存在的情况下,通过Unsafe可以根据当前类的地址通过相对偏移量的到byte数组的地址,这个地址也是具体的内存存放的地方。

protected final byte[] heapMemory;

当选择的是堆内内存的时候,这个heapMemory就是存放存储内容的byte数组。

protected long address;

当内存为堆内内存的时候address为byte数组的相对偏移量,而当为堆外内存的时候,address则为一个内存中的绝对地址。

protected final long addressLimit;

这个参数则是内存边界。

protected final int size;

Size自然是这一MemorySegment的内存大小,堆内内存情况下就是byte数组的长度。

private final Object owner;

Owner则为这一MemorySegment内存当前的使用对象。

具体的操作以int的获取为例子。

public final int getInt(int index) {final long pos = address + index;if (index >= 0 && pos <= addressLimit - 4) {return UNSAFE.getInt(heapMemory, pos);}else if (address > addressLimit) {throw new IllegalStateException("segment has been freed");}else {// index is in fact invalidthrow new IndexOutOfBoundsException();}
}

在获取制定位置的int的时候,由于int是四个字节,所以所要注意的是代表内存边界的addressLimit需要减4,之后通过unsafe直接获取对应位置上的数据。

public final int getIntLittleEndian(int index) {if (LITTLE_ENDIAN) {return getInt(index);} else {return Integer.reverseBytes(getInt(index));}
}

对于小端存储的,需要将得到的数据逆转byte位,得到相应的数据。

MemorySegment之间进行比较的compare()方法比较有意思。

public final int compare(MemorySegment seg2, int offset1, int offset2, int len) {while (len >= 8) {long l1 = this.getLongBigEndian(offset1);long l2 = seg2.getLongBigEndian(offset2);if (l1 != l2) {return (l1 < l2) ^ (l1 < 0) ^ (l2 < 0) ? -1 : 1;}offset1 += 8;offset2 += 8;len -= 8;}while (len > 0) {int b1 = this.get(offset1) & 0xff;int b2 = seg2.get(offset2) & 0xff;int cmp = b1 - b2;if (cmp != 0) {return cmp;}offset1++;offset2++;len--;}return 0;
}

参数len代表与需要进行比较的目标MemorySegment对象比较范围。

为了加快比较的速度,如果比较的长度大于8,首先会一次性取八个byte也就是八字节转化为long进行比较,加快比较的效率。

如果比较到剩余的位数小于8,那么开始逐字节进行比较,直到比较出相应的结果。

flink的MemorySegment相关推荐

  1. 追源索骥:透过源码看懂Flink核心框架的执行流程

    https://www.cnblogs.com/bethunebtj/p/9168274.html 追源索骥:透过源码看懂Flink核心框架的执行流程 前言 1.从 Hello,World WordC ...

  2. flink中的HybirdmemorySegment

    Flink使用MemorySegment来管理内存,同时也是flink中内存的抽象.MemorySegment的实现也分为HeapMemorySegment和HybirdMemorySegment. ...

  3. 一文带你彻底了解大数据处理引擎Flink内存管理

    摘要: Flink是jvm之上的大数据处理引擎. Flink是jvm之上的大数据处理引擎,jvm存在java对象存储密度低.full gc时消耗性能,gc存在stw的问题,同时omm时会影响稳定性.同 ...

  4. 追源索骥:透过源码看懂Flink核心框架的执行流程--来自GitHub

    追源索骥:透过源码看懂Flink核心框架的执行流程 联系qq2499496272可进行删除,需要文件版本的私聊!!~ 文章目录 追源索骥:透过源码看懂Flink核心框架的执行流程 前言 1.从 ~~H ...

  5. Flink随笔(1)

    相比 Spark Stream.Kafka Stream.Storm 等,为什么阿里会选择 Flink 作为新一代流式计算引擎?前期经过了哪些调研和对比? 大沙:我们是 2015 年开始调研新一代流计 ...

  6. 京东:Flink SQL 优化实战

    简介:本文着重从 shuffle.join 方式的选择.对象重用.UDF 重用等方面介绍了京东在 Flink SQL 任务方面做的优化措施. 本文作者为京东算法服务部的张颖和段学浩,并由 Apache ...

  7. Flink的处理背压​原理及问题-面试必备

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 来源:r6a.cn/gtsJ 反压机制(BackPressure)被广泛应 ...

  8. 聊聊flink的MemoryPool

    为什么80%的码农都做不了架构师?>>>    序 本文主要研究一下flink的MemoryPool MemoryPool flink-runtime_2.11-1.7.2-sour ...

  9. Flink应用实战案例50篇(一)- Flink SQL 在京东的优化实战

    一.背景 目前,京东搜索推荐的数据处理流程如上图所示.可以看到实时和离线是分开的,离线数据处理大部分用的是 Hive / Spark,实时数据处理则大部分用 Flink / Storm. 这就造成了以 ...

最新文章

  1. Spring5源码 - 11 Spring事件监听机制_源码篇
  2. 综合应用WPF/WCF/WF/LINQ之八:后台开发人员的Solution
  3. License for package Android SDK Build-Tools 28.0.2 not accepted.(MAC)
  4. 工业级PoE交换机的分类知识详解
  5. 移动商城html 源码,基于weui的移动商城html5模板
  6. 7-3 括号匹配 (15 分)
  7. WinCE的USB驱动开发
  8. python发送电子邮件
  9. WOW、ScrollReveal:WOW.js和ScrollReveal.js基础学习
  10. Mac安装Qt出现错误Could not resolve SDK Path for ‘macosx‘
  11. 智慧机场大数据可视化分析决策系统
  12. html5页面风格,H5页面设计风格大盘点!
  13. LZJ的python的第8次打卡
  14. 域名和网址链接被微信浏览器拦截怎么办 微信屏蔽网址打开如何解决
  15. 口袋里只有一百块钱,也要活出十个亿的气势
  16. Origin绘制双x,y轴图像
  17. 根据身高体重计算BMI指数 - scala
  18. 语义分析(Semantic Parsing)调研
  19. ALLOCATE语句分配FORTRAN动态数组方法
  20. 13 个优秀的 Vue 开源项目及合集推荐

热门文章

  1. sql sum()对空值的处理
  2. Git 日常开发常用命令
  3. element动态form实现
  4. spring事务浅析
  5. html5 dropdownlist,使用HTML5 FindByValue下拉列表(html5 dropdownlist using F
  6. git常用操作命令大全
  7. 日常 Python 编程优雅之道
  8. 什么样的网站建设公司才是值得信赖的?
  9. 阿里巴巴在宁成立江苏总部
  10. 20145209预备作业01