当前位置: 首页 > news >正文

flink 为啥使用MemorySegment 来管理内存

文章目录

      • 减少 GC 压力
      • 优化内存访问
      • 堆外内存(Off-Heap Memory)支持
      • 高效的序列化与反序列化
      • 内存分配的可控性
      • 适应不同的内存分配需求
      • 内存安全性

减少 GC 压力

Java 的自动垃圾回收(GC)机制在处理大量对象分配和释放时可能会产生性能瓶颈。在处理大量数据时频繁地分配和回收内存会触发较多的 GC,影响系统的稳定性和延迟。

MemorySegment 的内存管理是手动的,而不是依赖 JVM 的垃圾回收机制。它直接管理大块的内存(通常是堆外内存,或者直接内存),避免了大量的小对象进入垃圾回收器的堆中,从而减少了 GC 的频率和时间开销。

优化内存访问

Flink 中 MemorySegment 提供了高效的字节级别的访问和操作方式。相比使用 Java 内置的数组、Buffer 等结构,MemorySegment 提供更细粒度的控制,允许直接操作字节,从而减少中间对象创建和内存拷贝。

内存对齐:Flink 可以通过 MemorySegment 实现对齐的内存访问,减少 CPU 在进行内存读写时的开销,提升数据处理的性能。

堆外内存(Off-Heap Memory)支持

MemorySegment 可以直接使用堆外内存(off-heap memory)。Java 的堆内存虽然方便,但在大数据场景下堆外内存(直接内存)有以下好处:

堆外内存不会受 JVM 堆大小的限制,能处理更大的数据集。
堆外内存不受 JVM 的 GC 影响,减少 GC 停顿带来的延迟。
更灵活的内存分配策略,减少内存碎片。

高效的序列化与反序列化

在 Flink 中,数据在流动和传输时通常需要序列化和反序列化。MemorySegment 提供了字节级别的存储方式,使得 Flink 可以更高效地进行序列化和反序列化操作,避免使用复杂的 Java 对象,减少对象头和对象引用带来的额外开销。
这里解释下java 对象的占用内存大小问题
Java 对象存储密度低。Java 的对象在内存中存储包含 3 主要部分:对象头、实例数据、对齐填充部分。例如,一个只包含 boolean 属性的对象占一共占16 byte:对象头占 8byte, boolean 属性占 1 byte,为了对齐达到 8的倍数额外占 7 byte。而实际上只需要 1byte

内存分配的可控性

使用 MemorySegment,Flink 可以对内存的分配和回收进行更精确的控制。例如,Flink 中的排序和聚合操作会大量使用内存。通过 MemorySegment,Flink 可以手动管理这些操作所需的内存,避免 Java 自带的内存管理机制带来的不可预测性。

适应不同的内存分配需求

Flink 需要在不同的场景下灵活管理内存,例如:

对于缓冲区和缓存数据,可以在内存中保存大量数据块。
在批处理或流处理中,需要高效的中间数据存储。
通过 MemorySegment,Flink 可以适应各种内存使用场景,并通过手动管理内存实现高效的数据存储和访问。

内存安全性

MemorySegment 中的一些 API 提供了明确的边界检查和内存访问控制,避免了直接操作内存时可能出现的越界访问等问题,增加了内存使用的安全性。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 思维可视化:2024年四大创新思维导图软件排行榜!
  • 查看和升级pytorch到指定版本
  • dbt snapshot命令及应用示例
  • 网络安全-jsp绕过
  • 汽车总线详解
  • 计算器软件设计与实现
  • 1.4 MySql配置文件
  • uniapp js判断key是否在json中?
  • [LLM 学习笔记] Transformer 基础
  • [3]Opengl ES着色器
  • 【数据库选择】选择合适的数据库(MongoDB、PostgreSQL、Couchbase)以支持复杂 JSON 数据的增删改查
  • spring springboot 日志框架
  • 共享wifi公司哪家正规合法?具体流程全公开!
  • B+树(B+TREE)索引
  • 报表做着太费劲?为你介绍四款好用的免费报表工具
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • ES10 特性的完整指南
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • go append函数以及写入
  • java小心机(3)| 浅析finalize()
  • Koa2 之文件上传下载
  • magento2项目上线注意事项
  • MQ框架的比较
  • mysql_config not found
  • NSTimer学习笔记
  • Webpack入门之遇到的那些坑,系列示例Demo
  • windows下mongoDB的环境配置
  • 从PHP迁移至Golang - 基础篇
  • 分享几个不错的工具
  • 记一次和乔布斯合作最难忘的经历
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 山寨一个 Promise
  • 实习面试笔记
  • 学习笔记TF060:图像语音结合,看图说话
  • Semaphore
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • ​​​【收录 Hello 算法】9.4 小结
  • ​决定德拉瓦州地区版图的关键历史事件
  • "无招胜有招"nbsp;史上最全的互…
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #WEB前端(HTML属性)
  • #面试系列-腾讯后端一面
  • $().each和$.each的区别
  • $refs 、$nextTic、动态组件、name的使用
  • (02)Unity使用在线AI大模型(调用Python)
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (zt)最盛行的警世狂言(爆笑)
  • (八)Flink Join 连接
  • (二)fiber的基本认识
  • (二)hibernate配置管理
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (六)c52学习之旅-独立按键
  • (译)2019年前端性能优化清单 — 下篇