Netty Review - 探索ByteBuf的内部机制

文章目录

  • 概念
  • ByteBuf VS Java NIO Buffer
  • ByteBuf实现类
    • HeapByteBuf vs DirectByteBuf
    • PooledByteBuf vs UnpooledByteBuf
    • 其他
  • ByteBuf的实现机制

在这里插入图片描述


概念

ByteBuf是Netty中用于处理二进制数据的缓冲区

Netty的ByteBuf是一个可用于高效存储和操作字节数据的数据结构。与传统的ByteBuffer相比,ByteBuf提供了更灵活、更强大的API。

主要特性:

  • 可扩展性: ByteBuf支持动态扩展,可以自动扩展其容量以适应数据的增长。

  • 读写索引分离: 与ByteBuffer不同,ByteBuf有独立的读和写索引。这意味着可以读取和写入数据而无需手动切换模式。

  • 零拷贝: ByteBuf支持零拷贝操作,可以提高性能并降低内存复制的开销。

  • 池化支持: Netty提供了ByteBuf的池化支持,可帮助有效地重用内存以减少垃圾收集的压力。


ByteBuf VS Java NIO Buffer

ByteBuf则是Java NIO Buffer的新轮子,官方列出了一些ByteBuf的特性:

  • 需要的话,可以自定义buffer类型;
  • 通过组合buffer类型,可实现透明的zero-copy;
  • 提供动态的buffer类型,如StringBuffer一样,容量是按需扩展;
  • 无需调用flip()方法

ByteBuf实现类

ByteBuf提供了一些较为丰富的实现类,逻辑上主要分为两种:

  • HeapByteBuf
  • DirectByteBuf

实现机制则分为两种:

  • PooledByteBuf
  • UnpooledByteBuf

除了这些之外,Netty还实现了一些衍生ByteBuf(DerivedByteBuf),如:ReadOnlyByteBufDuplicatedByteBuf以及SlicedByteBuf

在这里插入图片描述

HeapByteBuf vs DirectByteBuf

HeapByteBufDirectByteBuf区别在于Buffer的管理方式:

  • HeapByteBuf由Heap管理,Heap是Java堆的意思,内部实现直接采用byte[] array;
  • DirectByteBuf使用是堆外内存,Direct应是采用Direct I/O之意,内部实现使用java.nio.DirectByteBuffer

PooledByteBuf vs UnpooledByteBuf

  • UnpooledByteBuf实现就是普通的ByteBuf了
  • PooledByteBuf是4.x之后的新特性

其他

  • DerivedByteBuf是ByteBuf衍生类,实现采用装饰器模式对原有的ByteBuf进行了一些封装。
  • ReadOnlyByteBuf是某个ByteBuf的只读引用;
  • DuplicatedByteBuf是某个ByteBuf对象的引用;
  • SlicedByteBuf是某个ByteBuf的部分内容。

ByteBuf的实现机制

Netty中的ByteBuf是一个强大的字节容器,用于处理字节数据。它的实现机制相当复杂,其主要特点如下

  • 内存分配: Netty的ByteBuf使用了一种称为池化的内存管理机制。这意味着它不是每次都直接分配新的内存,而是从预分配的内存池中获取。这有助于减少内存碎片化和提高性能。

    4.x开发了Pooled Buffer,实现了一个高性能的buffer池,分配策略则是结合了buddy allocation和slab allocation的jemalloc变种,代码在io.netty.buffer.PoolArena

  • 引用计数: ByteBuf使用了引用计数机制来跟踪对它的引用。这种方式允许多个部分同时引用同一个ByteBuf,而不会导致内存泄漏。当引用计数降至零时,内存将被释放回池。

  • 可读写的索引: ByteBuf通过维护两个索引来实现读写操作,分别是读索引(readerIndex)和写索引(writerIndex)。这两个索引允许你从中读取数据或将数据写入,而不会相互影响。

  • 零拷贝: Netty的ByteBuf支持零拷贝的特性,这意味着在某些情况下,数据可以在不涉及实际数据复制的情况下传递给其他组件。这对于提高性能和降低资源消耗非常重要。

    Zero-copy与传统意义的zero-copy不太一样。传统的zero-copy是IO传输过程中,数据无需中内核态到用户态、用户态到内核态的数据拷贝,减少拷贝次数。而Netty的zero-copy则是完全在用户态,或者说传输层的zero-copy机制,如下图。

    由于协议传输过程中,通常会有拆包、合并包的过程,一般的做法就是System.arrayCopy了,但是Netty通过ByteBuf.slice以及Unpooled.wrappedBuffer等方法拆分、合并Buffer无需拷贝数据。

    如何实现zero-copy的呢。slice实现就是创建一个SlicedByteBuf对象,将this对象,以及相应的数据指针传入即可,wrappedBuffer实现机制类似

    在这里插入图片描述

  • Composite ByteBuf: Netty提供了CompositeByteBuf,它是一种特殊的ByteBuf,可以将多个ByteBuf组合成一个逻辑上的ByteBuf。这使得可以在不实际复制数据的情况下聚合多个缓冲区

ByteBuf buffer1 = Unpooled.copiedBuffer("Hello, ".getBytes());
ByteBuf buffer2 = Unpooled.copiedBuffer("Netty!".getBytes());CompositeByteBuf compositeBuffer = allocator.compositeBuffer();
compositeBuffer.addComponent(true, buffer1);
compositeBuffer.addComponent(true, buffer2);// 使用compositeBuffer进行操作,它看起来像一个大的ByteBuf

CompositeByteBuf可以将多个ByteBuf组合成一个逻辑上的ByteBuf。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/164563.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

跳跃游戏[中等]

优质博文:IT-BLOG-CN 一、题目 给你一个非负整数数组nums,你最初位于数组的第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标,如果可以,返回true;否则,返…

阿里入局鸿蒙!鸿蒙原生应用再添两员新丁

今日HarmonyOS微博称,阿里钉钉、蚂蚁集团旗下的移动开发平台mPaaS与华为达成合作,宣布启动鸿蒙原生应用的开发!相关应用将以原生方式适配#HarmonyOS NEXT#系统。 #HarmonyOS#市场或迎来爆发式增长! 阿里钉钉 阿里钉钉与华为达成合…

Android 匿名内存深入分析

Android 匿名内存解析 有了binder机制为什么还需要匿名内存来实现IPC呢?我觉得很大的原因就是binder传输是有大小限制的,不说应用层的限制。在驱动中binder的传输大小被限制在了4M,分享一张图片可能就超过了这个限制。匿名内存的主要解决思路…

黑马点评-10实现用户点赞和点赞排行榜功能

用户点赞功能 如果用户只要点赞一次就对数据库中blog表中的liked字段的值加1就会导致一个用户无限点赞 PutMapping("/like/{id}") public Result likeBlog(PathVariable("id") Long id) {// 修改点赞数量,update tb_blog set liked liked 1 where id …

编译器核心技术概览

编译技术是一门庞大的学科,我们无法对其做完善的讲解。但不同用途的编译器或编译技术的难度可能相差很大,对知识的掌握要求也会相差很多。如果你要实现诸如 C、JavaScript 这类通用用途语言(general purpose language)&#xff0c…

buck降压电路

一、Buck电路的拓扑结构 Buck是直流转直流的降压电路,下面是拓扑结构,作为硬件工程师,这个最好是能够记下来,了然于胸。 为啥要记下来,自然是因为这个电路太基础了,并且谁都会用到,更重要的一点,面试可能会考。。。 上图是个异步buck,同步buck就是将里面的二极管换成M…

3D火山图绘制教程

一边学习,一边总结,一边分享! 本期教程内容 **注:**本教程详细内容 Volcano3D绘制3D火山图 一、前言 火山图是做差异分析中最常用到的图形,在前面的推文中,我们也推出了好几期火山图的绘制教程&#xff0…

Android——资源IDnonFinalResIds和“Attribute value must be constant”错误

一、异常描述 通过资源ID引用资源提示错误 Attribute value must be constant 二、解决方案 在根目录下的文件 gradle.properties 中添加如下配置,然后Sync Project android.nonFinalResIdsfalse 三、问题原因 android.nonFinalResIds 是Android开发中一个用于解…

此处不允许使用特性namespace

1.DOCTYPE 后面改成 mapper 2.PUBLIC一行中的Config改为Mapper 3.将下一行config变为小写的mapper <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.or…

交叉编译安装时报错 ./install.sh: 15: ./install.sh: Bad substitution

报错信息截图如下&#xff1a; 解决方法 vim install.sh #!/bin/sh -e 修改为 !/bin/bash -e重新执行 sudo ./install.sh 成功运行

【Java并发】聊聊线程池原理以及实际应用

线程其实对于操作系统来说是宝贵的资源&#xff0c;java层面的线程其实本质还是依赖于操作系统内核的线程进行处理任务&#xff0c;如果频繁的创建、使用、销毁线程&#xff0c;那么势必会非常浪费资源以及性能不高&#xff0c;所以池化技术&#xff08;数据库连接池、线程池&a…

畅谈Linux在小型微型企业中的应用

在这篇文章里我们讨论和畅谈一下linux系统在小微型企业中的应用&#xff0c;为什么会写这篇文章呢&#xff1f;因为在平时的工作中&#xff0c;认识的一些做小微型企业的朋友&#xff0c;他们经常找我咨询或是去解决一些平时工作中的IT相关的问题&#xff0c;那么小微型企业中的…

相同结构体不同类型转换

缘由&#xff1a; 最近开发上遇到一个问题&#xff0c;通过grpcgateway 处理后的int64&uint64类型数据均转换成了字符串类型&#xff0c;本身服务于前端&#xff0c;没有任何问题。但是 项目部署现场后&#xff0c;发现需要两套环境&#xff0c;那么就出现一个问题&#x…

2022 年十大 JavaScript 框架

2022 年十大 Web 应用开发 JavaScript 框架。 React.js jQuery Express Angular Vue.js Angular.js Svelte Next.js Ember.js Meteor React.js React.js 于 2013 年由 Meta(Facebook 前身) 推出&#xff0c;是一款开源的、免费的 JavaScript 库。React.js 被用于开…

C++中的map和set的使用

C中的map详解 关联式容器键值对树形结构的关联式容器set的使用1. set的模板参数列表2. set的构造3. set的迭代器4. set的容量5. set修改操作6. set的使用举例 map1. map的简介2. map的模板参数说明3. map的构造4. map的迭代器5. map的容量与元素访问6. map的元素修改 multimap和…

Linux vim操作教程(vim 基操、vim替换和查找、 vim改变文本颜色、判断和循环语句)

vim 基操 vim 是一个强大的文本编辑器,常用于在终端环境下编辑文件。下面是一些常用的 vim 操作: 打开文件:在终端中输入 vim 文件名 来打开一个文件,如果文件不存在,则会创建一个新文件。 模式切换: 按下 i 进入插入模式,在该模式下可以输入和编辑文本。按下 Esc 键返…

python单例模式

单例模式是一种创建型设计模式&#xff0c;它保证一个类仅有一个实例&#xff0c;并提供一个全局访问点。 在 Python 中&#xff0c;可以使用以下几种方式来创建单例模式&#xff1a; 使用 __new__ 方法 在 Python 中&#xff0c; __new__ 方法是一个类方法&#xff0c;它在…

msvcp120.dll丢失是什么意思,哪个修复方法最简单

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“找不到msvcp120.dll”。这个错误通常发生在运行某些程序或游戏时&#xff0c;它会导致程序无法正常启动或运行。那么&#xff0c;这个错误提示到底是什么意思呢&#xff1f;为了解决这个问…

深入了解Java8新特性-日期时间API_LocalDate类

阅读建议 嗨&#xff0c;伙计&#xff01;刷到这篇文章咱们就是有缘人&#xff0c;在阅读这篇文章前我有一些建议&#xff1a; 本篇文章大概12000多字&#xff0c;预计阅读时间长需要10分钟。本篇文章的实战性、理论性较强&#xff0c;是一篇质量分数较高的技术干货文章&…

【iOS】数据持久化(一)之Plist文件、Preference(NSUserDefaults类)

目录 什么是Plist文件&#xff1f;plist可以存储哪些数据类型plist文件数据的读取与存储 Perference&#xff08;NSUserDefaults&#xff09;使用方法registerDefaults: 方法的使用 什么是Plist文件&#xff1f; Plist文件&#xff08;属性列表&#xff09;是将某些特定的类&a…