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

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项目开发过程中&#xff0c;数据循环是常见的操作方式&#xff0c;以下是几种常见的数据循环方式&#xff1a; 一、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 下载地址&#xff1a; 阿里云rpmfind 1.2 本地安装&#xff1a; [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之硬件对比&#xff1a;据传英伟达Nvidia2025年将推出RTX 5090-32GB/RTX 5080-24GB、华为2025年推出910C/910D 目录 Nvidia的显卡 Nvidia的5090/5080/4090/4080&#xff1a;据传传英伟达Nvidia RTX 5090后续推出32GB版且RTX 5080后续或推出24GB版 RTX 5090相较于RTX 4090&…...

其他节点使用kubectl访问集群,kubeconfig配置文件 详解

上述两种方式&#xff1a;可使用kubectl连接k8s集群。 $HOME/.kube/config 是config文件默认路径&#xff0c;要么直接定义环境变量&#xff0c;要么就直接把文件拷过去 config文件里面&#xff0c;定义了context&#xff0c;里面指定了用户和对应的集群信息&#xff1a; ku…...

【鉴权】深入解析OAuth 2.0:访问令牌与刷新令牌的安全管理

目录 引言一、访问令牌&#xff08;Access Token&#xff09;1.1 访问令牌概述1.2 访问令牌的格式1.2.1 JWT&#xff08;JSON Web Token&#xff09;1.2.1.1 JWT 结构1.2.1.2 示例 JWT 1.2.2 Bearer Token 1.3 访问令牌的有效期1.4 访问令牌的工作流程 二、刷新令牌&#xff08…...

【AI视频换脸整合包及教程】AI换脸新星:Rope——让换脸变得如此简单

在数字技术迅猛发展的今天&#xff0c;人工智能&#xff08;AI&#xff09;的应用已经渗透到了我们生活的方方面面&#xff0c;从日常的语音助手到复杂的图像处理&#xff0c;无不体现着AI技术的魅力。特别是在娱乐和创意领域&#xff0c;AI技术更是展现出了惊人的潜力。其中&a…...

限界上下文(Bounded Context)

限界上下文(Bounded Context):领域驱动设计中的重要概念 在领域驱动设计(Domain-Driven Design, DDD)中,限界上下文(Bounded Context)是一个非常重要的概念。限界上下文定义了一个特定领域模型的边界,确保在这个边界内,领域模型的术语、规则和逻辑是一致的。通过明确…...

20241105专家访谈学习资料

“两性一度” 即高阶性、创新性、挑战度。“三性一度”是指教学目标的适应性、教学内容的先进性、教学实施的实践性及教学评价的有效度。“四性一度”是指系统性、层次性、前瞻性、专业性以及培养目标达成度。“二性一度”用词比较规范、标准统一&#xff0c;“三性一度”和“四…...

Docling:开源的文档解析工具,支持多种格式的解析和转换,可与其他 AI 工具集成

❤️ 如果你也关注大模型与 AI 的发展现状&#xff0c;且对大模型应用开发非常感兴趣&#xff0c;我会快速跟你分享最新的感兴趣的 AI 应用和热点信息&#xff0c;也会不定期分享自己的想法和开源实例&#xff0c;欢迎关注我哦&#xff01; &#x1f966; 微信公众号&#xff…...

oracle如何在不同业务场景下正确使用聚合查询、联合查询及分组查询?

引言 在数据库管理系统中&#xff0c;SQL&#xff08;结构化查询语言&#xff09;是用于与数据库进行交互的标准语言。 Oracle数据库作为一种广泛使用的关系数据库管理系统&#xff0c;提供了丰富的SQL功能&#xff0c;包括聚合查询、联合查询和分组查询等。 这些功能在数据…...

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&#xff0c;将save_as_binaryyes 改成save_as_binaryno&#xff0c;然后退出游戏重新存档&a…...

python manage.py下的命令及功能

python manage.py 是 Django 框架中用于管理 Django 项目的命令行工具 1、startapp&#xff1a; 功能&#xff1a;创建一个新的 Django 应用程序。 用法&#xff1a;python manage.py startapp appname 示例&#xff1a;python manage.py startapp blog 2、startproject&a…...

建筑行业员工离职SOP的数字化管理

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

江协科技STM32学习- P30 FlyMCU串口下载STLink Utility

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…...

05LangChain实战课 - 提示工程与FewShotPromptTemplate的应用

LangChain实战课 - 提示工程与FewShotPromptTemplate的应用 提示工程的重要性 在LangChain框架中&#xff0c;提示工程是构建有效大模型应用的关键。通过精心设计的提示&#xff0c;我们可以引导大语言模型&#xff08;LLM&#xff09;生成预期的输出。本节课深入探讨了如何利…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...