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

ByteBuffer 与 ByteBuf 的对比与优缺点分析

在 Java 网络编程和高性能 I/O 场景中,ByteBufferByteBuf 是两种重要的缓冲区处理工具。ByteBuffer 是 Java NIO 标准库的一部分,而 ByteBuf 是由 Netty 框架提供的增强缓冲区工具。在实际开发中,选择哪一种取决于场景需求和性能目标。

1. 什么是 ByteBuffer?

ByteBuffer 是 Java NIO(New Input/Output)中的核心类,用于以缓冲区的形式处理数据。它可以高效地读取、写入和操作字节数据,广泛用于文件读写、网络传输等场景。

ByteBuffer 的主要特性

  • 固定容量:分配时指定固定大小,不能动态扩展。
  • 操作模式切换:读写操作需要在 读模式写模式 之间切换。
  • 提供基本的字节操作:支持直接操作字节或转换为特定数据类型(如 int、long 等)。
  • 堆内存和直接内存支持ByteBuffer 可分配在堆内存或直接内存中,4.1版本后默认是直接内存,可以调用不同方法进行切换。
  • // 直接内存
    ByteBuf directBuf = ByteBufAllocator.DEFAULT.directBuffer();
    // 堆内存
    ByteBuf heapBuf = ByteBufAllocator.DEFAULT.heapBuffer();
    

2. 什么是 ByteBuf?

ByteBuf 是由 Netty 框架引入的增强型缓冲区工具。它针对 ByteBuffer 的一些缺点进行了优化,使得缓冲区在高性能场景中更高效且更易用。

ByteBuf 的主要特性

  • 动态扩展:支持自动扩容,避免手动重新分配缓冲区。
  • 读写指针分离:读操作和写操作有独立的指针,无需切换模式。
  • 池化机制:内置内存池,优化了内存分配和回收效率。
  • 零拷贝:支持更高级的零拷贝功能(如 slice 和复合缓冲区)。
  • 引用计数:通过引用计数机制有效管理缓冲区生命周期,避免内存泄漏。

3. ByteBuffer 与 ByteBuf 的对比

下表总结了 ByteBufferByteBuf 的核心差异和各自的优缺点:

特性ByteBufferByteBuf
读写模式使用同一个指针,需要切换模式(flip()compact()读写指针分离,无需手动切换,操作更简单
扩容支持不支持动态扩容,需手动重新分配支持动态扩容,内存自动调整
池化机制无池化机制,每次分配都需要系统调用支持内存池化(PooledByteBufAllocator),效率更高
零拷贝支持基础的 slice()duplicate()提供高级零拷贝支持(slice、复合缓冲区等)
引用计数不支持引用计数,生命周期需开发者手动管理支持引用计数(retain()release()),自动内存回收
API 易用性操作模式复杂,需手动管理指针位置提供更丰富和直观的 API,适合高性能场景
内存分配支持堆内存和直接内存支持堆内存、直接内存,以及池化内存
适用场景简单的 I/O 操作或 Java 标准库高性能网络编程(特别是基于 Netty 的开发)

4. ByteBuf 的优势详解

4.1 读写指针分离

  • ByteBuffer 使用同一个指针来管理读写位置,需要调用 flip() 切换读写模式。这种操作容易出错且不直观。比如:

ByteBuffer buffer = ByteBuffer.allocate(10);
buffer.put((byte) 1);
buffer.flip(); // 切换到读模式
byte b = buffer.get();
buffer.compact(); // 再次切换到写模式

ByteBuf 使用独立的读指针和写指针,无需模式切换:

ByteBuf buf = Unpooled.buffer(10);
buf.writeByte(1); // 写数据
byte b = buf.readByte(); // 直接读取,无需模式切换

4.2 动态扩容

  • ByteBuffer 的容量固定,当容量不足时,必须手动扩展。例如:

ByteBuffer buffer = ByteBuffer.allocate(10);
buffer.put((byte) 1); // 容量满了需要手动重新分配
ByteBuffer newBuffer = ByteBuffer.allocate(20);
buffer.flip();
newBuffer.put(buffer);

ByteBuf 支持动态扩容(最大值是Int最大值Integer.MAX_VALUE),无需手动管理:

ByteBuf buf = Unpooled.buffer(10);
buf.writeBytes(new byte[15]); // 自动扩容

4.3 内存池化

  • ByteBuf 提供内置内存池(PooledByteBufAllocator),通过对象复用优化内存分配效率,降低垃圾回收频率。
  • 对于高并发、高频分配的场景,池化机制可以显著提升性能。
  • netty4.1之后默认开启池化,但是安卓默认是非池化。需要切换到非池化需要加启动参数:
  • -Dio.netty.allocator.type=unpooled

4.4 零拷贝

  • ByteBuf 提供更强大的零拷贝功能:
    • slice:创建子缓冲区,避免数据复制。
    • 复合缓冲区(CompositeByteBuf):通过逻辑组合多个物理缓冲区,避免拷贝。
    • 直接内存支持:减少 JVM 堆到操作系统内核的拷贝。

4.5 引用计数

  • ByteBuf 使用引用计数来管理内存,避免内存泄漏或重复释放:
ByteBuf buf = PooledByteBufAllocator.DEFAULT.buffer();
buf.retain(); // 增加引用计数
buf.release(); // 减少引用计数,当计数归零时内存自动回收

5. 适用场景

  • 使用 ByteBuffer 的场景

    • 需要轻量级的缓冲区操作。
    • 使用标准 Java 库开发(无需额外依赖)。
    • 数据量较小且性能要求不高。
  • 使用 ByteBuf 的场景

    • 高性能网络编程,例如 Netty 中的 HTTP 服务、RPC 框架等。
    • 需要频繁扩展缓冲区或并发操作。
    • 高吞吐量场景,例如处理大规模流式数据。

相关文章:

ByteBuffer 与 ByteBuf 的对比与优缺点分析

在 Java 网络编程和高性能 I/O 场景中,ByteBuffer 和 ByteBuf 是两种重要的缓冲区处理工具。ByteBuffer 是 Java NIO 标准库的一部分,而 ByteBuf 是由 Netty 框架提供的增强缓冲区工具。在实际开发中,选择哪一种取决于场景需求和性能目标。 …...

js高级06-ajax封装和跨域

8.1、ajax简介及相关知识 8.1.1、原生ajax 8.1.1.1、AJAX 简介 AJAX 全称为 Asynchronous JavaScript And XML,就是异步的 JS 和 XML。 通过 AJAX 可以在浏览器中向服务器发送异步请求,最大的优势:无刷新获取数据。 按需请求,可…...

RabbitMQ3:Java客户端快速入门

欢迎来到“雪碧聊技术”CSDN博客! 在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将…...

D 型 GaN HEMT 在功率转换方面的优势

氮化镓 (GaN) 是一种 III-V 族宽带隙半导体,由于在用作横向高电子迁移率晶体管 (HEMT) 时具有卓越的材料和器件性能,因此在功率转换应用中得到越来越多的采用。 HEMT 中产生的高击穿电场 (3.3 MV/cm) 和高二维电子气 (2DEG) 载流子迁移率 (2,000 cm 2 /…...

Java Web后端项目的特点和组成部分

技术栈 #### Java Web技术: - **Servlet**:Java Web的核心,用于处理HTTP请求。 - **WebServlet注解配置**:用于简化Servlet的配置。 - **HttpServlet基类**:大多数Servlet都继承自此基类。 - **请求响应处理**&#x…...

Vue3 + Vite + TS 项目引入 Eslint + Pritter

文章目录 一、ESLint 简介主要功能适用场景常用的 Eslint 配置项 二、Pritter 简介主要功能适用场景常用的 Prettier 配置项 三、Vue3 Vite TS 项目引入 Eslint Pritter1. 安装 ESLint2. 初始化 ESLint 配置3. 在 Vite 项目中启用 ESLint4. 在 VS Code 中启用 ESLint5. 集成…...

用Tauri框架构建跨平台桌面应用:1、Tauri快速开始

Tauri 是一个构建适用于所有主流桌面和移动平台的轻快二进制文件的框架。开发者们可以集成任何用于创建用户界面的可以被编译成 HTML、JavaScript 和 CSS 的前端框架,同时可以在必要时使用 Rust、Swift 和 Kotlin 等语言编写后端逻辑。 Tauri 是什么? |…...

Django实现智能问答助手-数据库方式读取问题和答案

扩展 增加问答数据库,通过 Django Admin 添加问题和答案。实现更复杂的问答逻辑,比如使用自然语言处理(NLP)库。使用前端框架(如 Bootstrap)增强用户界面 1.注册模型到 Django Admin(admin.py…...

stm32利用LED配置基础寄存器+体验滴答定时器+hal库环境配置

P1 LED控制与流水灯效果实现 概述 大家好,今天我们来学习一下如何在STM32上控制LED灯,并且实现一个流水灯的效果。这不仅是一个基础的实践,也是嵌入式开发中非常常见的需求。 LED控制 1. LED初始化 首先,我们需要对LED灯对应…...

JAVA开源项目 桂林旅游景点导游平台 计算机毕业设计

博主说明:本文项目编号 T 079 ,文末自助获取源码 \color{red}{T079,文末自助获取源码} T079,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…...

docker安装使用Elasticsearch,解决启动后无法访问9200问题

1.docker安装、启动es docker pull elasticsearch:8.13.0docker images启动容器 docker run -d -p 9200:9200 -p 9300:9300 -e ES_JAVA_OPTS"-Xms256m -Xmx256m" --name es01 8ebd258614f1-d 后台运行-p 9200:9200 -p 9300:9300 开放与主机映射端口-e ES_JAVA_OPTS…...

GM、BP、LSTM时间预测预测代码

GM clc; clear; close all;%% 数据加载和预处理 [file, path] uigetfile(*.xlsx, Select the Excel file); filename fullfile(path, file); time_series xlsread(filename);% 确保数据是一列 time_series time_series(:);% 归一化数据 min_val min(time_series); max_v…...

《操作系统 - 清华大学》4 -5:非连续内存分配:页表一反向页表

文章目录 1. 大地址空间的问题2. 页寄存器( Page Registers )方案3. 基于关联内存(associative memory )的反向页表(inverted page table)4. 基于哈希(hashed)查找的反向页表5. 小结 1. 大地址空间的问题 …...

志愿者小程序源码社区网格志愿者服务小程序php

志愿者服务小程序源码开发方案:开发语言后端php,tp框架,前端是uniapp。 一 志愿者端-小程序: 申请成为志愿者,志愿者组织端进行审核。成为志愿者后,可以报名参加志愿者活动。 志愿者地图:可以…...

Java语言编程,通过阿里云mongo数据库监控实现数据库的连接池优化

一、背景 线上程序连接mongos超时,mongo监控显示连接数已使用100%。 java程序报错信息: org.mongodb.driver.connection: Closed connection [connectionId{localValue:1480}] to 192.168.10.16:3717 because there was a socket exception raised by…...

使用ufw配置防火墙,允许特定范围IP访问

文章目录 1. 安装 UFW(如果尚未安装)2. 允许特定 IP 地址访问 22 端口3. 允许特定子网访问 22 端口4. 启用 UFW5. 检查 UFW 状态6. 重新加载 UFW(如果需要)7. 删除规则(如果需要) 在ubuntu上使用 ufw&#…...

实现 UniApp 右上角按钮“扫一扫”功能实战教学

实现 UniApp 右上角按钮“扫一扫”功能实战教学 需求 点击右上角扫一扫按钮(onNavigationBarButtonTap监听),打开扫一扫页面(uni.scanCode) 扫描后,以网页的形式打开扫描内容(web-view组件),限制只能浏览带有执行域名的网站,例如…...

【2024亚太杯亚太赛APMCM C题】数学建模竞赛|宠物行业及相关产业的发展分析与策略|建模过程+完整代码论文全解全析

第一个问题是:请基于附件 1 中的数据以及你的团队收集的额外数据,分析过去五年中国宠物行业按宠物类型的发展情况。并分析中国宠物行业发展的因素,预测未来三年中国宠物行业的发展。 第一个问题:分析中国宠物行业按宠物类型的发展…...

ubtil循环函数调用

什么是until until循环是一种控制流结构。它与while循环相反,while循环是在条件为真时执行循环体,而until循环是在条件为假时执行循环体,直到条件为真时才停止循环。 until代码示例: i0 do until [ ! $i -lt 10 ] echo $…...

使用EFK收集k8s日志

首先我们使用EFK收集Kubernetes集群中的日志,本次实验讲解的是在Kubernetes集群中启动一个Elasticsearch集群,如果企业内已经有了Elasticsearch集群,可以直接将日志输出至已有的Elasticsearch集群。 文章目录 部署elasticsearch创建Kibana创建…...

伽马暴宇宙学分析中流量阈值选择的敏感性研究

1. 研究背景与核心问题在伽马射线暴(GRB)的宇宙学研究领域,一个长期困扰我们的核心问题是:我们看到的GRB样本,究竟在多大程度上反映了它们在宇宙中的真实分布?这听起来像是个哲学问题,但在实际操…...

如何在macOS上快速创建PDF文件:终极虚拟打印机解决方案

如何在macOS上快速创建PDF文件:终极虚拟打印机解决方案 【免费下载链接】RWTS-PDFwriter An OSX print to pdf-file printer driver 项目地址: https://gitcode.com/gh_mirrors/rw/RWTS-PDFwriter 想要在macOS上轻松创建PDF文件吗?RWTS PDFwriter…...

避开叶绿体基因组分析第一个坑:你的序列起始点真的在LSC开头吗?(附B站视频演示)

避开叶绿体基因组分析第一个坑:你的序列起始点真的在LSC开头吗?在叶绿体基因组分析中,一个看似简单却常被忽视的步骤——确定序列起始点,往往成为后续分析的隐形杀手。许多研究者花费大量时间在组装和注释上,却因为起始…...

CompressO:重新定义本地视频压缩的三大创新维度

CompressO:重新定义本地视频压缩的三大创新维度 【免费下载链接】compressO Convert any video/image into a tiny size. 100% free & open-source. Available for Mac, Windows & Linux. 项目地址: https://gitcode.com/gh_mirrors/co/compressO 当…...

Windows和Office一键激活终极指南:KMS_VL_ALL_AIO智能脚本完全解析

Windows和Office一键激活终极指南:KMS_VL_ALL_AIO智能脚本完全解析 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统激活和Office办公软件激活而烦恼吗?…...

BetterGI:解放双手的5大自动化场景终极解决方案

BetterGI:解放双手的5大自动化场景终极解决方案 【免费下载链接】better-genshin-impact 📦BetterGI 更好的原神 - 自动拾取 | 自动剧情 | 全自动钓鱼(AI) | 全自动七圣召唤 | 自动伐木 | 自动刷本 | 自动采集/挖矿/锄地 | 一条龙 | 全连音游 | 自动烹饪…...

Flutter Widgets组件详解:从基础到高级

Flutter Widgets组件详解:从基础到高级 一、Widget基础概念 在Flutter中,一切都是Widget。Widget是Flutter应用的基本构建块,它们描述了UI在某个特定时刻的外观。Flutter的Widget树是应用界面的核心结构。 1.1 Widget的分类 Flutter Widget主…...

Kubernetes自动化运维与CI/CD集成:构建高效的持续交付流水线

Kubernetes自动化运维与CI/CD集成:构建高效的持续交付流水线 一、CI/CD概述 CI/CD(持续集成/持续交付) 是一种自动化软件交付的方法论,在Kubernetes环境中集成CI/CD可以实现应用的自动化构建、测试和部署。 1.1 CI/CD流程 代码…...

NISQ时代量子机器学习实战:从变分量子电路到混合架构落地

1. 量子机器学习:从NISQ时代的现实挑战到工程实践如果你关注前沿科技,最近几年一定频繁听到“量子计算”和“机器学习”这两个词。当这两个看似在不同轨道上狂奔的领域开始交汇,就诞生了一个充满想象力又极具挑战的新方向——量子机器学习。我…...

如何利用AI工具变现:一个老程序员的真实观察

凌晨两点,你又刷到一个"AI月入5万"的短视频。 关了手机,睡不着了。 明天还要上班。 这种焦虑感,我太熟悉了。 作为一个写了12年代码的老程序员,这两年被问到最多的问题就是:"有什么真正能用的AI变现方法?" 今天不画饼,说点真话。 先说结论 AI…...