首页  

netty ByteBuf 实战     所属分类 netty 浏览量 1433
Zero-Copy-Capable Rich Byte Buffer

分类
pooled和unpooled
堆内和堆外
堆外分为 Safe和Unsafe



堆外内存2种使用方式
使用Unsafe ,需要自己释放
使用 NIO ByteBuffe ,依赖full gc 回收

 堆外内存使用实例 

提供两个索引  读索引 写索引
自动扩容
引用计数
池化   复用 减少碎片 提高性能
复合缓冲区 CompositeByteBuf

ByteBufAllocator
PooledByteBufAllocator
UnpooledByteBufAllocator

ByteBuf buffer(int initialCapacity, int maxCapacity);
// preferably a direct buffer which is suitable for I/O
ByteBuf ioBuffer(int initialCapacity, int maxCapacity);
ByteBuf heapBuffer(int initialCapacity, int maxCapacity);
ByteBuf directBuffer(int initialCapacity, int maxCapacity);


ByteBufUtil 工具类 
hexdump 打印ByteBuf内容的十六进制表示


ByteBuf 读写实例



	private static void runBufOp(ByteBuf buf){		
		System.out.println("\n\n*******runBufOp start");
	    showInfo(buf);
		// 写入第一个整数 , 读索引 0 ,写索引 4
		buf.writeInt(21);
	    showInfo(buf);
	    // 读取第一个整数 ,读索引 4 ,写索引 4 
	    int tmp = buf.readInt();
	    System.out.println("int value "+tmp);
	    showInfo(buf);

	    int num = 7;
	    // 写入 0 到 6 ,7个整数 , 超出容量限制 ,自动扩容
	    for(int i=0;i<num;i++){
			buf.writeInt(i);
	    }
	    showInfo(buf);

	    // 写索引 32 ,已达到 最大限制 ,写入失败 
	    try{
	    	buf.writeInt(num);
	    }catch(Throwable e){
	    	// java.lang.IndexOutOfBoundsException: writerIndex(32) + minWritableBytes(4) exceeds maxCapacity(32)
	    	System.out.println(e);
	    }
	    showInfo(buf);

	    // 丢弃已经读取的 , 会发生复制
	    // 读索引 变为 0 (之前已读取一个整数 读索引4 ), 写索引 变为28 
	    buf.discardReadBytes();
	    showInfo(buf);
	    // 写索引 28 ,再写入一个数字
	    buf.writeInt(num);
	    showInfo(buf);

	    // 连续读取 8个整数 
	    for(int i=0;i<=num;i++){
			System.out.print(buf.readInt()+",");
	    }
	    System.out.println();
	    showInfo(buf);
	    
        // ReferenceCountUtil.release(buf);
	    // showInfo(buf);
	    
	    // 增加 引用计数
	    buf.retain();
	    showInfo(buf);
	    // 释放 引用计数 减1
	    buf.release();
	    showInfo(buf);
	       
        ReferenceCountUtil.release(buf);
	    showInfo(buf);
	    
	    // refCnt 变为 0 时 ,不可用 
        // io.netty.util.IllegalReferenceCountException: refCnt: 0
	    // runBufOp(buf);
	    // io.netty.util.IllegalReferenceCountException: refCnt: 0, decrement: 1
	    // ReferenceCountUtil.release(buf);
	    
		System.out.println("*******runBufOp end \n");
	}


完整代码
https://gitee.com/dyyx/netty4demo/blob/master/src/main/java/dyyx/buf/ByteBufTest.java

上一篇     下一篇
netty性能优化点

netty ByteBuf 释放说明

eclipse使用用技巧

netty ByteBuf 泄露实例

netty使用技巧

vert.x介绍