`
eric_hwp
  • 浏览: 126623 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Netty的ByteBuf介绍

 
阅读更多

Netty的ByteBuf缓冲区实现地比Java本身的ByteBuffer更加灵活,方便。它的类结构也比较复杂,这里只说ByteBuf核心的几个要点。

1. 最重要的是要理解为什么要ByteBuf这个组件。主要还是因为基于select / poll / epoll这种IO多路复用技术的NIO是非阻塞同步IO的模型,由于是同步IO,需要用户线程自己来处理IO的读写,由于是非阻塞的,每次调用read, write读写的字节数是不确定的,所以非阻塞同步IO必须有缓冲区这个组件来保存每次读写的中间状态,通过缓冲区来确定是否读写完成。更多内容请参考http://blog.csdn.net/iter_zc/article/details/39291647

2. ByteBuf不是对ByteBuffer的封装,而是重新实现了一个缓冲区。ByteBuffer只使用了一个position指针来记录当前的读写位置,ByteBuf使用了两个指针readerIndex, writerIndex分别来记录当前的读写位置,使用起来更加简单和方便。

3. ByteBuffer是一个固定长度的缓冲区,当put方法要写的数据大于可写的容量时会抛出异常。ByteBuf改进了这个设计,支持自动扩容。每次put之前会检查是否可以完全写入,如果不能,就会自动扩展ByteBuf的容量,保证put方法不会抛出异常。

public ByteBuf writeInt(int value) {	ensureWritable(4);	_setInt(writerIndex, value);	writerIndex += 4;	return this;} public ByteBuf ensureWritable(int minWritableBytes) {	if (minWritableBytes < 0) {	throw new IllegalArgumentException(String.format(		"minWritableBytes: %d (expected: >= 0)", minWritableBytes));	}	if (minWritableBytes <= writableBytes()) {	return this;	}	if (minWritableBytes > maxCapacity - writerIndex) {	throw new IndexOutOfBoundsException(String.format(		"writerIndex(%d) + minWritableBytes(%d) exceeds maxCapacity(%d): %s",		writerIndex, minWritableBytes, maxCapacity, this));	}	// Normalize the current capacity to the power of 2.	int newCapacity = calculateNewCapacity(writerIndex + minWritableBytes);	// Adjust to the new capacity.	capacity(newCapacity);	return this;}//UnpooledHeapByteBuf的capacity方法来自动扩容public ByteBuf capacity(int newCapacity) {	ensureAccessible();	if (newCapacity < 0 || newCapacity > maxCapacity()) {	throw new IllegalArgumentException("newCapacity: " + newCapacity);	}	int oldCapacity = array.length;	if (newCapacity > oldCapacity) {	byte[] newArray = new byte[newCapacity];	System.arraycopy(array, 0, newArray, 0, array.length);	setArray(newArray);	} else if (newCapacity < oldCapacity) {	byte[] newArray = new byte[newCapacity];	int readerIndex = readerIndex();	if (readerIndex < newCapacity) {		int writerIndex = writerIndex();		if (writerIndex > newCapacity) {		writerIndex(writerIndex = newCapacity);		}		System.arraycopy(array, readerIndex, newArray, readerIndex, writerIndex - readerIndex);	} else {		setIndex(newCapacity, newCapacity);	}	setArray(newArray);	}	return this;}private void setArray(byte[] initialArray) {	array = initialArray;	tmpNioBuf = null;}

4. 和ByteBuffer一样,ByteBuf也支持堆内缓冲区和堆外直接缓冲区,根据经验来说,底层IO处理线程的缓冲区使用堆外直接缓冲区,减少一次IO复制。业务消息的编解码使用堆内缓冲区,分配效率更高,而且不涉及到内核缓冲区的复制问题。

5. ByteBuf的堆内缓冲区又分为内存池缓冲区PooledByteBuf和普通内存缓冲区UnpooledHeapByteBuf。PooledByteBuf采用二叉树来实现一个内存池,集中管理内存的分配和释放,不用每次使用都新建一个缓冲区对象。UnpooledHeapByteBuf每次都会新建一个缓冲区对象。在高并发的情况下推荐使用PooledByteBuf,可以节约内存的分配。在性能能够保证的情况下,可以使用UnpooledHeapByteBuf,实现比较简单。

分享到:
评论

相关推荐

    对于 Netty ByteBuf 的零拷贝(Zero Copy) 的理解1

    Netty ByteBuf 的零拷贝(Zero-Copy)理解 Netty 中的零拷贝(Zero-Copy)是指在操作数据时,不需要将数据 buffer 从一个内存区域拷贝到另一个内存区域,这样可以减少 CPU 的负载和内存带宽的占用。 Zero-Copy 通常...

    bytebuf-rs:类似于Netty ByteBuf的ByteBuf的Rust实现

    ByteBuf是Java的Netty框架中的一个核心组件,它是一个高效、线程安全的字节缓冲区,用于处理网络I/O。在Rust编程语言中,`bytebuf-rs`项目是一个模仿Netty ByteBuf设计的库,旨在提供类似的性能特性和功能。本文将...

    netty 在java中的字节码转换

    netty通信时经常和底层数据交互,C语言和java的数据类型和范围不同,通信时需要转化或兼容,附件为字节码、进制常用的转换类。

    Netty 演示 (Netty案例大全).zip

    丢弃服务器Netty 实现时间服务器Java ByteBuffer使用案例Netty ByteBuf使用案例Netty ByteBuf 的清晰使用模式Netty实现无连接协议Echo服务器、客户端Java线程池示例Java Reactor 示例基于自定义换行的解码器TCP...

    ByteBuf源码分析

    将Netty ByteBuf的相关类,进行梳理总结、源码分析,通过思维导图的注释看源码!

    Netty简介 Netty线程模型和EventLoop Codec编码与解码 ByteBuf容器

    ByteBuf是Netty提供的字节缓冲区,它是Java NIO ByteBuffer的一个增强版。ByteBuf提供了一种更高效的内存管理方式,支持读写索引独立,避免了BufferOverflow和BufferUnderflow等异常。它还支持堆内和堆外内存,以及...

    Netty进制转换乱码问题

    2. **Netty中的 ByteBuf**:Netty的ByteBuf提供了多种方法来读写字节,但并未涉及字符编码。例如,`writeBytes()`用于写入字节数组,`writeCharSequence()`则允许指定编码写入字符序列。在处理字符串时,确保使用`...

    netty服务器解析16进制数据

    Netty 提供了 `ByteBuf` 类作为缓冲区,用于高效地存储和操作字节数据。`ByteBuf` 支持读写操作,可以用于处理16进制数据。通过 `ByteBuf` 的方法,如 `readByte()`、`writeByte()`、`readInt()` 和 `writeInt()` ...

    跟闪电侠学Netty:Netty即时聊天实战与底层原理-book-netty.zip

    - **Buffer**:Netty的ByteBuf提供了高效的数据存储和传输功能,优于Java原生的ByteBuffer。 4. **Netty编程模型**:包括客户端和服务端的创建、连接建立、数据读写、异常处理等,通过编写自定义的Handler来实现...

    Netty进阶之路-跟着案例学Netty

    此外,Netty的ByteBuf类是高效内存管理的关键,它提供了缓冲区的读写操作,避免了不必要的数据拷贝。 在高级特性部分,书籍会涉及Netty的编解码器,如LineBasedFrameDecoder用于处理以换行符分隔的协议,以及...

    jt808netty版解析部分源码

    2. **ByteBuf操作**:Netty的ByteBuf提供了高效的字节操作,支持读写索引的独立控制,以及读写区域的分离。在解析过程中,会用到readInt(), readByte()等方法来读取消息头和消息体的数据。 3. **消息体解析**:由于...

    使用Netty搭建WebSocket服务器,可修改单包大小限制

    首先,我们需要了解Netty的ByteBuf和ChannelHandlerContext。ByteBuf是Netty中的缓冲区,用于存储和读写网络数据。ChannelHandlerContext则提供了与通道相关的操作,包括读写数据、处理事件等。 在构建WebSocket...

    Netty实战 电子版.pdf_java_netty_服务器_

    《Netty实战》是针对Java开发者的一本技术指南,它深入介绍了如何利用Netty这个高性能、异步事件驱动的网络应用程序框架来构建高效且可扩展的网络应用。Netty不仅简化了网络编程的复杂性,还提供了丰富的特性和组件...

    深入浅出Netty_netty_

    此外,Netty的ByteBuf是高效的数据缓冲区,提供了比Java NIO Buffer更友好的API。它支持预读和后写,可以在不复制数据的情况下进行读写操作,从而提高了性能。 书中的代码案例会涵盖如何创建服务器、建立连接、处理...

    Netty权威指南高清版本

    书中会介绍Channel、Selector、Buffer等NIO核心组件,并展示如何在Netty中使用它们。 接着,书中会深入讲解Netty的EventLoop和EventLoopGroup。EventLoop是Netty中的工作线程,负责处理I/O事件和执行用户定义的任务...

    整合netty实时通讯

    - Netty 的 ByteBuf 提供了高效的内存管理,避免了频繁的字节数组拷贝。 2. **WebSocket 协议** - WebSocket 协议通过 HTTP/HTTPS 协议握手建立连接,之后即可在连接上进行双向数据传输,无需重复的 HTTP 请求/...

    Netty实战.epub_netty实战epub_netty实战epub_netty_

    此外,还会涉及ByteBuf,这是Netty提供的高效内存管理工具,用于替代Java的ByteBuffer,提供更友好的API和更好的性能。 Netty的案例实战部分可能会涵盖常见网络协议的实现,如HTTP、HTTPS、FTP、WebSocket等,这些...

    Netty-API-文档中文版

    4. **高效的内存管理**:Netty 使用ByteBuf作为字节缓冲区,它提供了一种更高效的方式管理网络通信中的内存,避免了Java原生的ByteBuffer带来的性能损耗。 5. **强大的编码解码器**:Netty 提供了各种编码解码器,...

    netty-4.1.17.Final.jar

    你可以通过阅读源码学习到如何使用ChannelHandlerContext进行事件处理,如何定义自定义的ByteBuf以优化内存管理,以及如何编写频道管道(ChannelPipeline)来处理进来的网络请求。 Netty提供了丰富的协议支持,包括...

    Netty 教程 Netty权威指南

    2. **ByteBuf**:Netty 提供了 ByteBuf 作为缓冲区,相比传统的 ByteBuffer 更加高效,支持零拷贝,方便进行数据读写操作。 3. **ChannelHandler**:这是 Netty 中的核心组件,负责处理网络事件,如连接、读写、...

Global site tag (gtag.js) - Google Analytics