`
picasso.di
  • 浏览: 51040 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

MINA2官方教程翻译(5) 基本概念之IoBuffer

    博客分类:
  • MINA
阅读更多

简介

IoBuffer是MINA应用程序中使用的一种字节缓冲区,它是JDK中ByteBuffer类的替代品。MINA框架出于下面两个原因没有直接使用JDK中nio包内的ByteBuffe:

  • 没有提供可用的getters和putters方法,例如fill, get/putString, 和get/putAsciiInt();
  • 由于它的容量是固定的,所以不利于存储变长数据。

MINA 3 将改变这种情况。MINA框架对nio ByteBuffer做了一层封装的最主要原因是希望能够拥有一种可扩展的缓冲区。这并不是一个很好的决定。缓冲区就是缓冲区:一个用于存储临时数据的临时空间,直到这些数据被使用。其实还有些其他的解决方案,例如可以对一组nio ByteBuffer进行包装来避免数据从一个缓冲区向两个容量更大的缓冲区复制,从而得到一个容量可扩展的缓冲区。

或许在filter之间传递数据时使用InputStrea来代替字节缓冲区会更加舒适,因为这不需要提供一种可以存储数据的特性,这种数据结构可以使字节数组、字符串或者其他类型的消息等等。

最后,但并非最不重要的一点是,当前的实现并没有达成一个目标:零拷贝策略(例如当我们从socket中读取了一些数据,我们希望避免持续的数据拷贝)。如果我们使用了可以扩展的字节缓冲区,那么我们只需要在管理大数据消息时进行数据拷贝。请记住MINA ByteBuffer只不过是NIO ByteBuffer的顶层封装,当我们使用direct buffers时,很可能是一个很严重的问题。

 

IoBuffer 操作

分配一个新的Buffer

IoBuffer 是一个抽象类,所以它不能直接被实例化。分配IoBuffer,我们可以使用两种allocate()方法。

// Allocates a new buffer with a specific size, defining its type (direct or heap)
public static IoBuffer allocate(int capacity, boolean direct)

// Allocates a new buffer with a specific size
public static IoBuffer allocate(int capacity)

allocate()方法是用一个或两个参数。第一种形式使用两个参数:

  • capacity - buffer的容量
  • direct -buffer的类型。true 意味着得到一个direct buffer,false 意味着得到一个heap buffer

 

默认的buffer分配是由SimpleBufferAllocator 处理的。

可选的, 下面的形式也可以使用:

IoBuffer buffer = IoBuffer.allocate(8);
buffer.setAutoExpand(true);

buffer.putString("12345678", encoder);
       
// Add more to this buffer
buffer.put((byte)10);

 按照上面的例子,如果数据的长度大于8byte的话,IoBuffe会根据情况重新分配其内置的ByteBuffer,它的容量会被加倍,它的limit会增长到String被写入时的最后position。这种行为与StringBuffer工作的方式十分类似。

注意:这种程序结构在MINA3.0时会被废弃,因为这并不是增长buffer容量的最好方式。这种方式很可能被一种类似InputStream的方式所替代,在InputStream的背后很可能是一组固定长度的ByteBuffers。

 

创建自动收缩的Buffer

为了节省内存,在有些情形下我们需要释放被额外分配的内存,IoBuffer提供了autoShrink 属性来达到此目的。如果autoShrink属性被打开,当compact()方法被调用时,IoBuffer回将部分的回收其容量,只使用四分之一或是更少的容量。如果需要手动控制收缩行为,请使用shrink()方法。

让我们实践一下:

IoBuffer buffer = IoBuffer.allocate(16);
buffer.setAutoShrink(true);
buffer.put((byte)1);
System.out.println("Initial Buffer capacity = "+buffer.capacity());
buffer.shrink();
System.out.println("Initial Buffer capacity after shrink = "+buffer.capacity());

buffer.capacity(32);
System.out.println("Buffer capacity after incrementing capacity to 32 = "+buffer.capacity());
buffer.shrink();
System.out.println("Buffer capacity after shrink= "+buffer.capacity());

 我们初始化分配一个容量为16的buffer,并将自动收缩设置为true。

让我们看一下输出的结果:

Initial Buffer capacity = 16
Initial Buffer capacity after shrink = 16
Buffer capacity after incrementing capacity to 32 = 32
Buffer capacity after shrink= 16

 让我们分析一下输出:

  • 初始化buffer的容量为16,因为我们使用16指定了该buffer的容量,16也就成了该buffer的最小容量
  • 调用shrink()方法后,容量仍旧为16,所以无论怎么调用紧缩方法,容量都不好小于其初始容量
  • 增加该buffer的容量至32,该buffer的容量达到32
  • 调用 shrink()方法,容量回收至16,从而剔除了冗余的容量

再次强调,这种方式是一种默认的行为,我们不需要明确指明一个buffer是否能被收缩。

 

Buffer分配

IoBufferAllocater负责分配并管理buffer,如果你希望使用你的方式精确控制分配行为,请自己实现IoBufferAllocater 接口。

MINA提供了IoBufferAllocater的两种实现,如下:

  • SimpleBufferAllocator (默认) - 每次创建一个新的buffer
  • CachedBufferAllocator - 缓存buffer,使buffer在扩展时可以被重用

注意:在新版本的JVM中,使用cached IoBuffer并不能明显提高性能。

你可以自己实现IoBufferAllocator接口并在IoBuffer上调用setAllocator()方法来指定使用你的实现。

4
0
分享到:
评论

相关推荐

    MINA2官方教程翻译

    以下是对MINA2官方教程翻译的部分内容的详细解释: 1. **包和命名的变化**: - 在MINA2中,所有的类和方法遵循驼峰命名规则,例如`SSLFilter`被重命名为`SslFilter`。NIO相关的传输类前缀统一添加了`Nio`,如`...

    Mina2中文文档

    Mina2中文文档提供了从基础到高级全面覆盖Mina框架的技术文档,不仅包括基本概念和技术细节,还包含了许多实用的示例代码和最佳实践。对于希望利用Mina开发高性能网络应用程序的开发者来说,这是一份非常有价值的...

    Apache_MINA_2_用户指南.pdf

    本章节介绍了 IoBuffer 的基本概念和特性。 * IoBuffer 是 MINA 中的一个核心组件,负责管理 I/O 缓存。 * IoBuffer 提供了一个灵活的架构,使得开发者可以轻松地构建高性能的 I/O 操作。 Chapter 9 - 编解码器...

    mina学习的最佳代码

    下面将深入讲解MINA的核心概念和关键组件。 1. **非阻塞I/O (NIO)**:MINA利用Java的非阻塞I/O API,允许一个线程处理多个连接。这种模式在处理大量并发连接时效率极高,因为它避免了线程上下文切换的开销。 2. **...

    Java学习之IO总结及mina和netty

    Java NIO(New IO)引入了通道(Channel)和缓冲区(Buffer)的概念,提高了IO性能,并支持非阻塞IO。 MINA(Multipurpose Infrastructure for Network Applications)是一个高度可扩展且高性能的网络应用开发框架...

    MINA_API+MINA_DOC+mina

    通过这个文档,开发者可以详细了解到MINA提供的各种接口、类和方法,包括IO服务端和客户端的创建、协议编码和解码、事件驱动模型等核心概念。例如,NioSession代表网络连接会话,FilterChain用于处理数据过滤,...

    MINA2与Netty4比较分析

    接下来将根据标题和描述的要求详细分析Mina2与Netty4的区别,重点从它们的线程模型、Buffer使用以及Netty4中集成的序列化工具ProtoBuf等方面进行比较。 首先,Mina2和Netty4都是异步事件驱动的网络应用框架。Netty4...

    Mina2.0阅读源码笔记(很值得一看)

    - **UserGuide**: 用户指南,涵盖了 Mina 的基本概念和多个实用示例,是深入理解 Mina 功能的关键文档。 #### 二、Mina 核心概念与组件 1. **IoBuffer** - IoBuffer 是 Mina 中用于数据存储和传输的核心类,它是...

    Mina2.0自学手册

    《Mina2.0自学手册》是一本针对初学者设计的教程,旨在详细指导读者如何使用mina框架来实现网络通信。mina是一个基于Java的网络应用框架,它使用Java NIO(New Input/Output)技术来实现高吞吐量和低延迟的网络通信...

    Apache-Mina-2.rar_apache mina_java mina_mina_mina-core-1.1.3

    手册可能涵盖了Mina的基本概念、架构、API使用、以及如何构建实际的应用程序等内容。对于初学者来说,这样的文档可以帮助快速理解和上手Mina,对于有经验的开发者,它也能提供必要的参考和解决实际问题的策略。 ...

    mina-core-2.0.1.jar,apache-mina-2.0.1

    4. **Buffer**:MINA 提供了 ByteBuffer 和 IoBuffer 两种缓冲区,用于在网络通信中高效地读写数据。 **MINA 2.0.1 版本特点:** 1. **性能优化**:在 2.0.1 版本中,MINA 进行了多方面的性能提升,包括更快的数据...

    Mina 使用DEMO

    5. **数据传输**:数据的读写操作通过IoBuffer对象进行,它提供了一种高效、灵活的数据缓冲机制。 ### 3. MinaStudy 示例分析 在"MinaStudy"这个DEMO中,我们可以看到以下关键部分: - **初始化服务端**:创建一...

    mina简单示例

    2. **Filter**:过滤器是Mina的核心概念之一,它们允许你在数据传输过程中进行拦截和处理。你可以添加多个过滤器来实现如数据编码解码、安全加密等功能。 3. **ProtocolCodecFactory**:这个接口用于定义如何将数据...

    官方最新Apache MINA 2.0二进制包和源代码

    - **Buffer管理**:MINA中的IoBuffer用于高效地读写网络数据,理解和掌握IoBuffer的使用是必要的。 - **心跳机制**:为了检测网络连接是否活跃,MINA支持心跳机制,确保数据传输的可靠性。 - **线程模型**:MINA允许...

    mina框架demo

    MINA(Multipurpose Infrastructure for ...- **IoBuffer**:MINA提供的缓冲区类,用于高效地处理网络数据。 通过分析和运行"TestMina"项目,你可以更深入地了解MINA如何处理网络通信,并将其应用到自己的项目中。

    MINA 2.0.9源码

    MINA的核心特性在于它的异步IO模型,它采用了NIO(Non-blocking I/O)技术,使得应用程序在处理大量并发连接时能够更加高效。这种模型下,当数据不可读写时,不会阻塞线程,而是返回控制权,允许程序处理其他任务,...

    MINA 服务器端实现 可运行

    1. **异步事件驱动**:MINA采用非阻塞I/O模型,即NIO(New IO)模式,通过Selector监听多个通道(Channel)的事件,如连接请求、数据读写等,提高了服务端处理大量并发连接的能力。 2. **生命周期管理**:MINA提供...

    mina apach 网络通信框架高性能例子

    1. **非阻塞I/O**:MINA基于Java NIO(New IO)库,利用通道(Channel)和选择器(Selector)进行非阻塞I/O操作。这种模式下,当数据不可读写时,线程不会被阻塞,而是继续处理其他连接,从而提高了系统资源利用率和...

    Android长连接神器框架Mina之服务器和客户端例子

    Mina提供了一套丰富的`IoBuffer`类用于数据的读写操作,支持各种类型的数据转换,如字节、字符串、对象等。`IoBuffer`提供了一种高效的缓冲区管理方式,可以高效地进行数据存取。 ### 性能优化 1. **线程模型**:...

Global site tag (gtag.js) - Google Analytics