美文网首页Netty
Netty之ByteBuf介绍

Netty之ByteBuf介绍

作者: Real_man | 来源:发表于2019-03-17 09:18 被阅读0次

    内存分配是Netty中最为底层的一部分,主要负责从底层的IO中读取到ByteBuf,然后传递给应用程序,应用程序处理完之后封装为ByteBuf,写回给IO。这块内容相比于Netty的其它模块是非常复杂的。

    • 内存类别
    • 多线程内存分配竞争
    • 不同大小内存如何分配

    ByteBuf结构

    先了解下ButeBuf结构和常用的API,ByteBuf内部有两个指针,提供了顺序的读写操作,读操作有readerIndex(),写操作有writerIndex()。

    如图:

    image-20190317084755953
    • readerIndex代表从当前指针开始读

    • writerIndex代表从当前位置开始写

    • capacity代表当前ByteBuf的容量

    • 0readerIndex之间的数据是无效的,readerIndexwriterIndex之间的数据是可写的,writerIndex~capcity之间的数据是空闲的额,可以写入。当数据不断的增大的时候,会在maxcapacity内对capacity进行扩容

    当读取数据直到readerIndex与writerIndex达到同样的值时候,会抛出IndexOutOfBoundsException。

    ByteBuf API

    主要有以下几类的常用API

    • read : 移动读指针
    • write: 移动写指针
    • set,get: 不会移动指针,在特定的index设置值,或者获取值
    • mark,reset: 在读写之前把当时的指针状态保存起来,读写完之后,在调用reset就可以复原原先的操作。这个时候就算进行了读写,也没有改变index。
    • readableBytes:this.writerIndex - this.readerIndex ,如上图,(写指针-读指针)之间的数据
    • writableBytes:this.capacity - this.writerIndex ,如图,(容量-写指针)之间的数据
    • maxWritableBytes:this.maxCapacity - this.writerIndex,(最大容量-写指针)之间的数据

    ByteBuf 分类

    AbstractByteBuf是ByteBuf的骨架实现,其它的类大都是基于AbstractByteBuf实现。

    简单的看两个方法:

        public byte readByte() {
            // 检查字节是否可读
            checkReadableBytes0(1);
            int i = readerIndex;
            // 读取字节放到子类中实现,不同的子类读取字节的方式不同
            byte b = _getByte(i);
            // 读指针加1
            readerIndex = i + 1;
            return b;
        }
        
        @Override
        public ByteBuf writeByte(int value) {
            // 确保是可以进行写的
            ensureAccessible();
            ensureWritable0(1);
            // 写自己放到子类中实现,并且写指针加1
            _setByte(writerIndex++, value);
            return this;
        }
    

    那么分类:

    • Pooled与Unpoold:每次是从内存中已经分配好的内存中去取还是重新分配内存。
    • Unsafe与非Unsafe:Unsafe可以直接拿到内存地址,也就是是否使用JDK内部的Unsafe对象直接操作操作系统的内存。
    • Heap与Direct:Heap直接在堆上分配,参与GC。Direct是在堆外分配,不参与GC。Direct分配的内存需要手动的释放。
    image-20190317091247507

    最后

    关于ByteBuf的简单介绍就到这了。

    相关文章

      网友评论

        本文标题:Netty之ByteBuf介绍

        本文链接:https://www.haomeiwen.com/subject/upuymqtx.html