ByteBuf是做什么用的?Netty中传递字节数据的容器。
使用模式 | 描述 | 优点 | 劣势 |
---|---|---|---|
堆缓冲区 | 数据存存储在JVM的堆空间中,又称为支撑数组,通过 hasArray 来判断是不是在堆缓冲区中 | 没使用池化情况下能提供快速的分配和释放 | 发送之前都会拷贝到直接缓冲区 |
直接缓冲区 | 存储在物理内存中 | 能获取超过jvm堆限制大小的空间写入channel比堆缓冲区更快 | 释放和分配空间昂贵(使用系统的方法)操作时需要复制一次到堆上 |
复合缓冲 | 单个缓冲区合并多个缓冲区表示 | 操作多个更方便 | - |
复合缓冲 单个缓冲区合并多个缓冲区表示 操作多个更方便-
ByteBuf本身有一定的容量限制,默认最大的是Integer.MAX_VALUE,超出范围抛IndeOutOfBoundsException
两个索引将ByteBuf分隔成3个区域
任何新分配的、包装的或者复制的默认大小readerIndex/writeIndex都是0,任何read或者skip开头的都会增加readerIndex已读字节数,write开头的操作则会增加writeIndex相应字节数。另外参数中包含ByteBuf且没有目标索引的[比如 readBytes(ByteBuf dest) writeBytes(ByteBuf dest)],会影响对应的readerIndex(写的方法影响readerIndex)writeIndex(读的方法影响writeIndex)。
调用discardReadBytes()会移动可读字节到下标0,可读字节平移(原来可读字节的内容没有做擦除,只是移动了writeIndex)
调用clear()方法,则仅重置索引,使得readIndex和writeIndex为0,不做任何内存复制
ByteBuf专门呈现内容视图的方法,它们返回新的ByteBuf实例有自己的索引,但是内部存储共享,即它的内容修改了源实例也会改变。方法比如 slice / Unpooled.unmodifiableBuffer / order / readSlice / duplicate 。
需要完全独立的副本则选择使用 copy