Netty ByteBuf 分配 | 池化复用 、直接内存
Netty ByteBuf 分配
本文主要内容关于 ByteBuf 分配介绍,为了更好的理解本文,我们可以带着几个问题思考
- 在IO密集型业务场景下,可能涉及大量ByteBuf分配,这时我们需
- 要考虑会不会产生OOM
- 会不会出现频繁GC
- 会不会内存泄露
根据上面的问题,没准你也设计出netty的分配方案,主要关键点
- 避免重复分配,你也许会想到 线程池类似的复用技术
- 解放GC,你会如何绕过GC , 于是想到直接内存,因为直接内存需要手动释放资源,因此你需要考虑潜在的内存泄露问题
ByteBufAllocator
ByteBufAllocator 是 Netty用于分配 ByteBuf 对象 的接口,ByteBuf 分配方式主要有下面两个维度
-
在堆上分配还是使用直接内存
堆上分配,受JVM 垃圾回收管理,不需要手动释放资源。
直接内存不受JVM垃圾收集机制的管理,需要手动释放资源,在处理I/O操作时,直接内存可以提高性能,因为它减轻垃圾收集的压力
-
使用缓存池复用 和 不使用缓存池
池化技术我们平常接触的有数据库连接池、线程池等,它避免资源重复创建和销毁带来的代价,Netty 对象分配也支持用缓冲池复用。
ByteBufAllocator 分配方法介绍
- buffer()
自动判断在堆上分配 or 直接内存上分配(判断依据是否支持Unsafe)
-
ioBuffer()
尽可能在对直接内存上分配,因为直接内存更适合用于IO,如果不支持则在堆上分配。
-
heapBuffer()
在堆上分配,受垃圾回收机制管理
- directBuffer()
使用直接内存分配
- CompositeByteBuf 分配
compositeBuffer()/compositeHeapBuffer()/compositeDirectBuffer()/ 用于CompositeByteBuf 分配
ByteBufAllocator 主要实现类
- PooledByteBufAllocator
使用缓冲池技术,通过重复利用已经分配的ByteBuf,能够有效地减少内存分配和释放的开销。
- UnpooledByteBufAllocator
它在每次分配ByteBuf时都会创建一个新的实例。
Unpooled
非池化分配也可以使用Unpooled 工具类,Unpooled 工具类其实调用UnpooledByteBufAllocator进行分配的,它提供了许多便捷的静态方法。
使用举例
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;
import io.netty.buffer.PooledByteBufAllocator;
import io.netty.buffer.UnpooledByteBufAllocator;public class ByteBufAllocatorExample {public static void main(String[] args) {// 使用池化分配器ByteBufAllocator pooledAllocator = PooledByteBufAllocator.DEFAULT;// 分配一个堆内存 ByteBufByteBuf heapBuf = pooledAllocator.heapBuffer(1024);heapBuf.writeBytes("Hello, Heap Buffer!".getBytes());System.out.println("Heap Buffer: " + heapBuf.toString(io.netty.util.CharsetUtil.UTF_8));heapBuf.release();// 分配一个直接内存 ByteBufByteBuf directBuf = pooledAllocator.directBuffer(1024);directBuf.writeBytes("Hello, Direct Buffer!".getBytes());System.out.println("Direct Buffer: " + directBuf.toString(io.netty.util.CharsetUtil.UTF_8));directBuf.release();// 使用非池化分配器ByteBufAllocator unpooledAllocator = UnpooledByteBufAllocator.DEFAULT;// 分配一个堆内存 ByteBufByteBuf heapBufUnpooled = unpooledAllocator.heapBuffer(1024);heapBufUnpooled.writeBytes("Hello, Unpooled Heap Buffer!".getBytes());System.out.println("Unpooled Heap Buffer: " + heapBufUnpooled.toString(io.netty.util.CharsetUtil.UTF_8));heapBufUnpooled.release();// 分配一个直接内存 ByteBufByteBuf directBufUnpooled = unpooledAllocator.directBuffer(1024);directBufUnpooled.writeBytes("Hello, Unpooled Direct Buffer!".getBytes());System.out.println("Unpooled Direct Buffer: " + directBufUnpooled.toString(io.netty.util.CharsetUtil.UTF_8));directBufUnpooled.release();ByteBuf unpooledBuffer = Unpooled.buffer(1024);}
}
总结
要不要使用缓冲池,使用直接内存还是Java堆都要看具体业务,在IO场景Netty 内部优先使用直接内存;频繁的IO操作推荐使用缓冲池分配,避免内存频繁创建和销毁带来的开销。
相关文章:

Netty ByteBuf 分配 | 池化复用 、直接内存
Netty ByteBuf 分配 本文主要内容关于 ByteBuf 分配介绍,为了更好的理解本文,我们可以带着几个问题思考 在IO密集型业务场景下,可能涉及大量ByteBuf分配,这时我们需 要考虑会不会产生OOM会不会出现频繁GC会不会内存泄露 根据上…...

【数据结构】堆和二叉树(2)
文章目录 前言一、建堆和堆排序1.堆排序 二、二叉树链式结构的实现1.二叉树的遍历 三、链式二叉树的功能函数1.二叉树结点个数2.二叉树叶子结点个数3.二叉树的高度4.二叉树第k层结点个数5. 二叉树查找值为x的结点6.二叉树销毁 总结 前言 接着上一篇博客,我们继续分…...
Oracle分区技术特性
Oracle 的分区是一种“分而治之”的技术,通过将大表、索引分成可以独立管理的、小的 Segment,从而避免了对每个对象作为一个大的、单独的 Segment 进行管理,为海量数据访问提供了可伸缩的性能。自从 Oracle 引入分区技术以来,Orac…...

Hive操作库、操作表及数据仓库的简单介绍
数据仓库和数据库 数据库和数仓区别 数据库与数据仓库的区别实际讲的是OLTP与OLAP的区别 操作型处理(数据库),叫联机事务处理OLTP(On-Line Transaction Processing),也可以称面向用户交易的处理系统,它是针对具体业务…...

智能网联汽车:人工智能与汽车行业的深度融合
内容概要 在这个快速发展的时代,智能网联汽车已经不再是科幻电影的专利,它正在悄然走进我们的日常生活。如今,人工智能(AI)技术与汽车行业的结合犹如一场科技盛宴,让我们看到了未来出行的新方向。通过自动…...
VUE 循环的使用方法集锦
vue---循环方式以及跳出循环 在做VUE项目开发过程中,数据循环是常见的操作方式,以下是几种常见的数据循环方式: 一、for循环 let data [1,2,3,4,5,6,7,8,9,10]; for(let i0; i<data.length; i){console.log(data[i]);if(i>5){break;…...
Centos部署资料
1. 离线rpm 1.1 下载地址: 阿里云rpmfind 1.2 本地安装: [rootlocalhost ~]# yum localinstall unzip-6.0-21.el7.x86_64.rpm2. 服务器操作 2.1 修改网络ip [rootlocalhost ~]# cd /etc/sysconfig/network-scripts/ [rootlocalhost network-script…...

AI之硬件对比:据传英伟达Nvidia2025年将推出RTX 5090-32GB/RTX 5080-24GB、华为2025年推出910C/910D
AI之硬件对比:据传英伟达Nvidia2025年将推出RTX 5090-32GB/RTX 5080-24GB、华为2025年推出910C/910D 目录 Nvidia的显卡 Nvidia的5090/5080/4090/4080:据传传英伟达Nvidia RTX 5090后续推出32GB版且RTX 5080后续或推出24GB版 RTX 5090相较于RTX 4090&…...

其他节点使用kubectl访问集群,kubeconfig配置文件 详解
上述两种方式:可使用kubectl连接k8s集群。 $HOME/.kube/config 是config文件默认路径,要么直接定义环境变量,要么就直接把文件拷过去 config文件里面,定义了context,里面指定了用户和对应的集群信息: ku…...
【鉴权】深入解析OAuth 2.0:访问令牌与刷新令牌的安全管理
目录 引言一、访问令牌(Access Token)1.1 访问令牌概述1.2 访问令牌的格式1.2.1 JWT(JSON Web Token)1.2.1.1 JWT 结构1.2.1.2 示例 JWT 1.2.2 Bearer Token 1.3 访问令牌的有效期1.4 访问令牌的工作流程 二、刷新令牌(…...

【AI视频换脸整合包及教程】AI换脸新星:Rope——让换脸变得如此简单
在数字技术迅猛发展的今天,人工智能(AI)的应用已经渗透到了我们生活的方方面面,从日常的语音助手到复杂的图像处理,无不体现着AI技术的魅力。特别是在娱乐和创意领域,AI技术更是展现出了惊人的潜力。其中&a…...
限界上下文(Bounded Context)
限界上下文(Bounded Context):领域驱动设计中的重要概念 在领域驱动设计(Domain-Driven Design, DDD)中,限界上下文(Bounded Context)是一个非常重要的概念。限界上下文定义了一个特定领域模型的边界,确保在这个边界内,领域模型的术语、规则和逻辑是一致的。通过明确…...
20241105专家访谈学习资料
“两性一度” 即高阶性、创新性、挑战度。“三性一度”是指教学目标的适应性、教学内容的先进性、教学实施的实践性及教学评价的有效度。“四性一度”是指系统性、层次性、前瞻性、专业性以及培养目标达成度。“二性一度”用词比较规范、标准统一,“三性一度”和“四…...

Docling:开源的文档解析工具,支持多种格式的解析和转换,可与其他 AI 工具集成
❤️ 如果你也关注大模型与 AI 的发展现状,且对大模型应用开发非常感兴趣,我会快速跟你分享最新的感兴趣的 AI 应用和热点信息,也会不定期分享自己的想法和开源实例,欢迎关注我哦! 🥦 微信公众号ÿ…...
oracle如何在不同业务场景下正确使用聚合查询、联合查询及分组查询?
引言 在数据库管理系统中,SQL(结构化查询语言)是用于与数据库进行交互的标准语言。 Oracle数据库作为一种广泛使用的关系数据库管理系统,提供了丰富的SQL功能,包括聚合查询、联合查询和分组查询等。 这些功能在数据…...
Hearts of Iron IV 之 Archive Modification
存档位置 C:\Users\XXX\Documents\Paradox Interactive\Hearts of Iron IV\save games 打开文档 打开C:\Users\XXX\Documents\Paradox Interactive\Hearts of Iron IV\settings.txt,将save_as_binaryyes 改成save_as_binaryno,然后退出游戏重新存档&a…...
python manage.py下的命令及功能
python manage.py 是 Django 框架中用于管理 Django 项目的命令行工具 1、startapp: 功能:创建一个新的 Django 应用程序。 用法:python manage.py startapp appname 示例:python manage.py startapp blog 2、startproject&a…...

建筑行业员工离职SOP的数字化管理
在建筑行业,随着数字化转型的深入,对员工离职的标准操作程序(SOP)进行数字化管理变得尤为重要。这不仅有助于提高管理效率,还能确保离职流程的规范性和合规性。本文将探讨建筑行业如何通过数字化手段管理员工离职SOP&a…...

江协科技STM32学习- P30 FlyMCU串口下载STLink Utility
🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝…...
05LangChain实战课 - 提示工程与FewShotPromptTemplate的应用
LangChain实战课 - 提示工程与FewShotPromptTemplate的应用 提示工程的重要性 在LangChain框架中,提示工程是构建有效大模型应用的关键。通过精心设计的提示,我们可以引导大语言模型(LLM)生成预期的输出。本节课深入探讨了如何利…...

CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...
SQL Server 触发器调用存储过程实现发送 HTTP 请求
文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...

云安全与网络安全:核心区别与协同作用解析
在数字化转型的浪潮中,云安全与网络安全作为信息安全的两大支柱,常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异,并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全:聚焦于保…...

AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)
Name:3ddown Serial:FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名:Axure 序列号:8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...
React核心概念:State是什么?如何用useState管理组件自己的数据?
系列回顾: 在上一篇《React入门第一步》中,我们已经成功创建并运行了第一个React项目。我们学会了用Vite初始化项目,并修改了App.jsx组件,让页面显示出我们想要的文字。但是,那个页面是“死”的,它只是静态…...
用鸿蒙HarmonyOS5实现国际象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的国际象棋小游戏的完整实现代码,使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├── …...