netty bytebuf转byte数组_netty udp

netty bytebuf转byte数组_netty udp网络传输的载体是byte,这是任何框架谁也逃脱不了的一种规定,JAVA的NIO提供了ByteBuffer,用来完成这项任务,当然ByteBuffer也很好的完成了这个任务,Netty也提供了一个名字很相似的载体叫做ByteBuf,相比于ByteBuf而言,它有着更加更多友善的API,也更加易于维护,并且它可以扩容一般来说,ByteBuf都是维护一个byte数组的,它的内部格式是

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

  网络传输的载体是byte,这是任何框架谁也逃脱不了的一种规定,JAVA的NIO提供了ByteBuffer,用来完成这项任务,当然ByteBuffer也很好的完成了这个任务,Netty也提供了一个名字很相似的载体叫做ByteBuf,相比于ByteBuf而言,它有着更加更多友善的API,也更加易于维护,并且它可以扩容

一般来说,ByteBuf都是维护一个byte数组的,它的内部格式是长成这个样子的

 *      +-------------------+------------------+------------------+
 *      | discardable bytes |  readable bytes  |  writable bytes  |
 *      |                   |     (CONTENT)    |                  |
 *      +-------------------+------------------+------------------+
 *      |                   |                  |                  |
 *      0      <=      readerIndex   <=   writerIndex    <=    capacity

与原生态的ByteBuffer相比,它维护了两个指针,一个是读指针,一个是写指针,而原生态的ByteBuffer只维护了一个指针,你需要调用flip方法来切换读写的状态,不易用户管理维护

读的时候,可读的区域是下标区间是[readerIndex,writeIndex),可写区间的是[writerIndex,capacity-1],但是discardable这段区间就会变得相对无用,既不能读,也不能写

所以我们可以使用discardReadBytes的方法进行内存空间的回收,回收之后是这样的:

 *      +------------------+--------------------------------------+
 *      |  readable bytes  |    writable bytes (got more space)   |
 *      +------------------+--------------------------------------+
 *      |                  |                                      |
 * readerIndex (0) <= writerIndex (decreased)        <=        capacity

discardReadBytes之后,可读段被移到了该内存空间的最左端,可写段从空间容量来说,变大了,变成了回收之前的可写段+discard段内存之和,这样做的唯一问题就是性能问题,因为可读段的字节迁移问题,如果大量调用该方法,会产生很多的复制操作,所以除非能获取discard的很大空间,一般情况下,高并发的情况下,不适合多调用

当然还有clear方法,这个方法简单易懂,调用之前ByteBuf是长成这样的:

 *      +-------------------+------------------+------------------+
 *      | discardable bytes |  readable bytes  |  writable bytes  |
 *      +-------------------+------------------+------------------+
 *      |                   |                  |                  |
 *      0      <=      readerIndex   <=   writerIndex    <=    capacity

调用完之后是长成这样的:

 *      +---------------------------------------------------------+
 *      |             writable bytes (got more space)             |
 *      +---------------------------------------------------------+
 *      |                                                         |
 *      0 = readerIndex = writerIndex            <=            capacity

ByteBuf除了discardReadBytes和clear方法之外,还提供了大量的丰富的读写方法,此处就不一一列举了

还有几个比较重要的API,这里也说明一下

1)duplicate方法:复制当前对象,复制后的对象与前对象共享缓冲区,且维护自己的独立索引

2)copy方法:复制一份全新的对象,内容和缓冲区都不是共享的

3)slice方法:获取调用者的子缓冲区,且与原缓冲区共享缓冲区

关于ByteBuf一些比较重要的API的认识就是这些,因为我目前还没有使用的一些心得,希望以后有机会分享

我们再来看看ByteBuf的继承关系图:

netty bytebuf转byte数组_netty udp

netty bytebuf转byte数组_netty udp

netty bytebuf转byte数组_netty udp

强行盗了三张图,不管是从什么角度来分析,ByteBuf说到底还是维护了一个字节数组

目前为止,Netty提供来的ByteBuf都是堆内内存,大概是因为我们平时写的都是channel,写的是业务逻辑的代码

我们可以看到堆外内存分配的源代码:

    DirectByteBuffer(int cap) {                   // package-private

        super(-1, 0, cap, cap);
        boolean pa = VM.isDirectMemoryPageAligned();
        int ps = Bits.pageSize();
        long size = Math.max(1L, (long)cap + (pa ? ps : 0));
        Bits.reserveMemory(size, cap);

        long base = 0;
        try {
            base = unsafe.allocateMemory(size);
        } catch (OutOfMemoryError x) {
            Bits.unreserveMemory(size, cap);
            throw x;
        }
        unsafe.setMemory(base, size, (byte) 0);
        if (pa && (base % ps != 0)) {
            // Round up to page boundary
            address = base + ps - (base & (ps - 1));
        } else {
            address = base;
        }
        cleaner = Cleaner.create(this, new Deallocator(base, size, cap));
        att = null;



    }

并且在我们平时的普通开发中,用的也是Unpool类型的普通ByteBuf,但是在一些高并发的应用中,Pooled化的ByteBuf性能会更加优秀

关于ByteBuf初步的了解就这么多了,先暂时分享一下,希望以后能有其他的使用体会

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/191734.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(1)
blank

相关推荐

  • linux里chmod_linux常用的20个命令

    linux里chmod_linux常用的20个命令linux中chmod命令的使用方法发布时间:2020-06-2417:05:24来源:亿速云阅读:79作者:元一这篇文章运用简单易懂的例子给大家介绍linux中chmod命令的使用方法,代码非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。chmod介绍:linux中可以使用命令chmod来为文件或目录赋予权限。Linux/Unix的档案存取权限分为三级:档案拥有者、群组、其…

    2022年10月20日
  • LuaJIT简介[通俗易懂]

    LuaJIT简介[通俗易懂]LuaJIT是刚刚在即时编译器(JIT)为» 的Lua编程语言。Lua是一个功能强大,动态和轻量级的编程语言。它可能被嵌入或用作通用的,独立的语言兼容性WindowsLinux的BSDOSXPOSIXEmbeddedAndroid的iOS版PS3PS4PSVitaXbox360GCCCLANG LLVMMSVC8664位

  • e6600相当于amd_cpu核心电压

    e6600相当于amd_cpu核心电压据消费调研中心ZDC统计结果显示,2006年3月最受用户关注的前十款AMDCPU中,Athlon64和Sempron两大系列产品平分秋色,各有五款产品入围。具体产品排行如下图所示。(图)2006年3月最受用户关注的前十款AMDCPU排名产品名称报价L2缓存(KB)插槽类型主频(MHz)1¥990512Socket93918003¥765512Socket93918005¥1,120512S…

  • 深蓝病毒关闭端口_445端口关闭方法

    深蓝病毒关闭端口_445端口关闭方法计算机被永恒之蓝感染后会出一些不明所以的问题,我电脑上不定时蓝屏,同事电脑上也是,网上搜索了解决方法,包括以下几种:1)使用360杀毒,记得用最新的版本。2)自己下windows对应补丁。3)关闭445端口。——————————————————-注意:(1)关闭了445端口要重启后才会…

    2022年10月17日
  • spring boot框架介绍_Spring框架是什么

    spring boot框架介绍_Spring框架是什么前面的铺垫文章已经连着写了六篇了,主要是介绍了Spring和SpringMVC框架,小伙伴们在学习的过程中大概也发现了这两个框架需要我们手动配置的地方非常多,不过做JavaEE开发的小伙伴们肯定也听说过“约定大于配置”这样一句话,就是说系统,类库,框架应该假定合理的默认值,而非要求提供不必要的配置,可是使用Spring或者SpringMVC的话依然有许多这样的东西需要我们进行配置,这样不仅徒增工作量

  • 分区表-理论

    分区表-理论目的分区表的主要目的是方便数据的维护,而不是提升MySQL数据库的性能。《高性能MySQL》中:分区的一个主要目的是将数据按照一个较粗的粒度分在不同的表中,这样做可以将相关的数据放在一起,另外

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号