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操作推荐使用缓冲池分配,避免内存频繁创建和销毁带来的开销。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

推荐一款windows右键管理工具:ContextMenuManager

Windows右键菜单管理工具是一款可以为系统打造一个异常丰富的右键菜单组,能自定义添加右键菜单项和管理“发送到”及第三方程序添加的右键菜单项目。 主要功能 一个纯粹的Windows右键菜单管理程序 • 管理常见位置右键菜单、自定义添加右键菜单 • 启用或禁用文件…

#渗透测试#SRC漏洞挖掘#自动化脚本的编写01

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停…

个人学习记录平台的

摘 要 随着互联网的不断发展,人们由Web 1.0以静态、单向阅读为主的只读式网络走向了以分享为内核的实时现代化网络,即Web 2.0时代逐渐向着Web 3.0迈进。 随着技术的不断更新迭代,互联网从业者也必须处于终身学习的状态,他们要不…

算法日记 14—16 day 二叉树

前两天没有更新,这次把之前的补上,大篇章。 直接冲!!! 题目:找树坐下角的值 513. 找树左下角的值 - 力扣(LeetCode) 给定一个二叉树的 根节点 root,请找出该二叉树的 最…

第三十一章 Vue之路由(VueRouter)

目录 一、引言 1.1. 路由介绍 二、VueRouter 三、VueRouter的使用 3.1. 使用步骤(52) 3.2. 完整代码 3.2.1. main.js 3.2.2. App.vue 3.2.3. Friend.vue 3.2.4. My.vue 3.2.5. Find.vue 一、引言 1.1. 路由介绍 Vue中路由就是路径和组件的映…

特朗普钦定的编程语言!

大家好,我是程序员面试刷题平台的鸭鸭! 鸭鸭昨天一直关注美国大选,最终川普获胜!然后就刷到了一个图: 看到上面这张图片了吗? 你没有看错,特朗普也开始关心起 Java 了!Java 的迷弟…

day20:三剑客——awk基础

一,概述 AWK 是一种用于处理文本和数据的编程语言,特别擅长用于处理格式化文本文件。它通过将输入数据分成字段,逐行进行处理,广泛应用于数据分析、文本处理和系统管理中。 二,使用方式 命令模式(重点&a…

如何优化 B2B 转化率?这些步骤你不可不知

企业怎么才能把上网逛的人变成潜在买家,再进一步变成真金白银的付费客户呢?这对营销团队来说,可是头等大事。特别是在B2B这行,提升转化率(CRO)不光是任务,更是让营销更高效、收入噌噌涨的秘密武…

CPU Study-Multi-Port Cache

参考来源:《超标量处理器设计》—— 姚永斌 关于Multi-Port Cache可以参考:https://compas.cs.stonybrook.edu/~nhonarmand/courses/sp16/cse502/slides/04-caches.pdf 为了实现每个周期执行多条load/store指令,Cache必须支持多端口。 True…

Linux-c TCP服务模型

1、TCP模型,服务端与客户端的搭建时序图 2、TCP模型,在创建阶段和通信阶段,对套接字的理解 2.1、tcp连接阶段 2.2、tcp通信状态 一个服务端与多个客户端的通信状态 TCP与UDP的对比 (下图是笔者理解所画,可能也许有错…

一文了解Android的Doze模式

Android 的 Doze 模式是一项省电功能,主要用于减少设备的功耗,特别是在屏幕关闭且设备长时间未被使用的情况下。Doze 模式在 Android 6.0(API Level 23)首次引入,并在后续版本中不断改进,以便更智能地管理后…

Redis设计与实现 学习笔记 第十六章 Sentinel

Sentinel(哨岗、哨兵)是Redis的高可用性(high availability)解决方案:由一个或多个Sentinel实例(instance)组成的Sentinel系统可以监视任意多个主服务器,以及这些主服务器属下的从服…

I.MX6U 裸机开发3. GPIO操作控制LED灯

I.MX6U 裸机开发3. GPIO操作控制LED灯 一、创建项目目录及源文件1. 新建目录2. 远程开发环境3. 创建源文件 二、代码编写1. 打开时钟2. 配置端口复用功能为GPIO3. 配置端口电气属性4. 设置GPIO方向(GDIR寄存器)5. 输出6. 死循环等待 三、编译程序1. 整体…

雷军-2022.8小米创业思考-11-新零售:用电商思维做新零售,极致的效率+极致的体验。也有弯路,重回极致效率的轨道上。

第十一章 新零售 当我们说到小米模式的时候,其实我们说的是两件东西: 一是小米模式的本质,即高效率的商业模式; 另一件是小米这家公司具象的商业模式,这是小米在实践中摸索、建立的一整套业务模型。 从2015年到202…

Java:多态的调用

1.什么是多态 允许不同类的对象对同一消息做不同的响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)。多态使用了一种动态绑定(dynamic binding)技术,指在执行期间判断所引用…

基于Python的学生宿舍管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

基于springboot+vue实现的网上预约挂号管理系统 (源码+L文+ppt)4-104

结合现有六和医院网上预约挂号管理系统的特点,应用新技术,构建了六和医院网上预约挂号管理系统。首先从需求出发,对目前传统的六和医院网上预约挂号管理进行了详细的了解和分析。根据需求分析结果,对系统进行了设计,并…

C++初阶(九)--初识模板

目录 引入 一、什么是模板 二、函数模板 1.函数模板的概念 2.函数模板的格式 template关键字 模板参数列表 3.函数模板的原理 4.函数模板的实例化 5.数模板的匹配原则 三、类模板 1.类模板的定义格式 2.类模板的实例化 引入 在编程的世界里,我们经常…

C语言 | Leetcode C语言题解之第537题复数乘法

题目: 题解: bool parseComplexNumber(const char * num, int * real, int * image) {char *token strtok(num, "");*real atoi(token);token strtok(NULL, "i");*image atoi(token);return true; };char * complexNumberMulti…

牛客网项目总结

下面这幅图是牛客网项目的架构图,最下层是Spring Boot,表示我们所有的技术都是基于Spring Boot,上面一层是Spring,Spring上面是Spring MVC、Spring MyBatis 和 Spring Security。 通过Spring MVC 解决前后端请求交互的问题&#…