Mina IoBuffer的特性介绍

原文地址:Mina IoBuffer(Apache Mina user guide Chapter8 IoBuffer)

一个字节缓冲区被Mina的应用程序所使用。这是一个ByteBuffer的替代类。Mina不直接使用NIOByteBuffer,有两个原因:

  • 它不提供有用的getters和putters方法,如fill/ putString,get/ putAsciiInt()。
  • 由于其固定容量很难写变长数据.

这将在Mina3改变。Mina有自己的包装主要原因是拓展nio ByteBuffer实现可扩展的缓冲区。这是一个非常糟糕的决定。缓冲区缓冲:临时存储临时数据,之前使用它。存在许多其他的解决方案,比如定义一个包装器,依靠NIO
bytebuffer的列表,而不是复制现有的缓冲区更大的一个仅仅因为我们希望延长缓冲能力。

它也可能是更舒适使用InputStream而不是一个字节缓冲区的过滤器,因为它并不意味着对存储数据的性质:它可以是一个字节数组,字符串,消息……

最后,同样重要的是,当前实现失败的一个目标:零拷贝策略(例如,一旦我们从套接字读取数据,稍后我们不想做一个副本)。我们使用可扩展字节缓冲区,我们将肯定复制这些数据如果我们有处理大消息。假设Mina的ByteBuffer只是一个包装器NIO
ByteBuffer之上,在使用直接缓冲区时这可能是一个真正的问题。

1.1.1. IoBuffer操作

1.1.1.1. 分配一个新的缓冲区

IoBuffer是一个抽象类,因此不能直接实例化。分配IoBuffer,我们需要使用两个allocate()方法中的一个。

<span style="font-size:12px;">// 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)</span>

allocate()方法接受一个或两个参数。第一个结构需要两个参数:

· capacity - 缓冲区的容量大小

· direct -
类型的缓冲区。true直接使用缓冲区,false使用堆缓冲区

默认的缓冲区分配是由SimpleBufferAllocator处理的。

另外,还可以使用以下形式:

<span style="font-size:12px;">// Allocates heap buffer by default.
IoBuffer.setUseDirectBuffer(false);

// A new heap buffer is returned.
IoBuffer buf = IoBuffer.allocate(1024);</span>

使用第二种形式时,别忘了之前设置默认缓冲类型,否则您将得到默认堆缓冲区。

1.1.2. 创建自动扩展的缓冲区

创建自动扩大缓冲与java NIO API不是很容易,因为固定大小的缓冲区。有一个缓冲区,可以自动扩展需要的是网络应用的一大亮点。为了解决这个问题,IoBuffer引入了autoExpand属性。它会自动扩大容量和极限值。

让我们看看如何创建一个自动扩大缓冲区:

<span style="font-size:12px;">IoBuffer buffer = IoBuffer.allocate(8);

buffer.setAutoExpand(true);

buffer.putString("12345678", encoder);

// Add more to this buffer

buffer.put((byte)10);</span>

底层ByteBuffer在幕后重新分配是IoBuffer。如果编码数据大于8个字节在上面的例子中。容量大小将翻倍,其限制将增加到最后位置的字符串。这种行为非常类似于StringBuffer类的工作方式。

这种机制很可能是远离Mina3.0,因为它不是最好的方式来处理增加的缓冲区大小。取而代之的应该是类似InputStream隐藏列表或一个固定大小的bytebuffer)数组。

1.1.3. 创建自动收缩的缓冲区

有些情况下,调用释放另外分配的字节缓冲区以保存到内存。IoBuffer提供autoShrink属性处理的需要。如果autoShrink打开,IoBuffer半紧凑时缓冲区的容量()调用,只有1/4或少使用当前的能力。手动收缩缓冲区,使用shrink()方法。

让我们看看这种方式:

<span style="font-size:12px;">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());</span>

我们最初分配一个容量为16,autoShrink属性设置为true。

我们来看它的输出:

<span style="font-size:12px;">Initial Buffer capacity = 16
Initial Buffer capacity after shrink = 16
Buffer capacity after incrementing capacity to 32 = 32
Buffer capacity after shrink= 16</span>

让我们休息一下和分析输出:

  • 初始缓冲容量是16,我们创建的缓冲能力。内部这变成了最低的缓冲能力
  • 调用后shrink(),能力仍然是16,能力永远不会小于最小能力
  • 增加32的能力后,变成了32的能力
  • shrink()的调用,减少能力16,从而消除额外的存储

同样,这种应该是一个默认机制,无需影响告诉缓冲,它可以缩小。

1.1.4. 缓冲区分配

IoBufferAllocater负责分配和管理缓冲区。精确控制缓冲区分配策略,实现IoBufferAllocater接口。

Mina附带IoBufferAllocater的实现:

  • SimpleBufferAllocator(默认),每次都创建一个新的缓冲区
  • CachedBufferAllocator——缓存缓冲区可能被重用扩张

在新的可用的JVM中,使用缓存IoBuffer很可能提高性能。

您可以实现您自己的实现IoBufferAllocator并调用setAllocator() 在IoBuffer使用相同。

时间: 2024-10-16 13:27:14

Mina IoBuffer的特性介绍的相关文章

mina IoBuffer

mina IoBuffer 常用方法 Limit(int) 如果position>limit, position = limit,如果mark>limit, 重置mark Mark() 取当前的position的快照标记mark Reset() 恢复position到先前标记的mark Clear() limit=capacity , position=0,重置mark,但是不清空数据,为了从头开始put做准备,其实就是清空数据,因为你put就覆盖了原来的数据 Rewind() positio

ArcGIS 10.2新特性介绍:影像

1.新增栅格类型 新增支持三种新的栅格类型:DMCii.Pleiades 和 SPOT6. 同时,新增提供中国卫星 Raster Type 扩展下载,支持中国卫星影像数据在ArcGIS 中的管理和使用.扩展支持的卫星产品包括: HJ 1A/1B CCD raster type ZY02C HRC raster type ZY02C PMS raster type ZY3 – CRESDA ZY3 – SASMAC 对于支持的国产卫星,正射.融合.镶嵌和匀色等常用处理,通过 ArcGIS 的On-

Hadoop 2.4.0新特性介绍

在2014年4月7日,Apache发布了Hadoop 2.4.0 .相比于hadoop 2.3.0,这个版本有了一定的改进,突出的变化可以总结为下列几点(官方文档说明): 1 支持HDFS访问控制列表(ACL,Access Control Lists) 这个特性解决了在一定情况下,文件权限访问的权限问题.其机制是基于Linux文件访问权限的特征,如果你熟悉Linux的文件访问机制,你就不用再去理解HDFS文件访问的特性了. 有了ACL特性后,对HDFS文件系统就具有了良性的扩展特性.HDFS-4

ArcGIS 10.3 for Desktop新特性介绍

ArcGIS 10.3是一个完整公布的ArcGIS平台,它包含新的产品(ArcGIS Pro),针对10.2版本号产品进行了功能增强和稳定性的改进. ArcGIS 10.3 for Server新特性介绍 http://blog.csdn.net/linghe301/article/details/31358733 ------------------------------------------------------------------ 版权全部,文章同意转载,但必须以链接方式注明源地

报表工具-ECharts 特性介绍

ECharts 特性介绍 ECharts,一个纯 Javascript 的图表库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,Safari等),底层依赖轻量级的 Canvas 类库 ZRender,提供直观,生动,可交互,可高度个性化定制的数据可视化图表. ECharts 3 中更是加入了更多丰富的交互功能以及更多的可视化效果,并且对移动端做了深度的优化. 丰富的图表类型 ECharts 提供了常规的折线图,柱状图,散点图,

NHibernate 3.0.0.Alpha1 发布及新特性介绍

发布 刚刚NHibernate的Leader--Fabio Maulo发布了NHibernate 3.0.0.Alpha1版本,这是NHibernate 3.0.0的第一个公开测试版本. 下载地址 你可以到这里下载NHibernate 3.0.0.Alpha1,基于.Net3.5平台,具体文件如下. NHibernate源码:NHibernate-3.0.0.Alpha1-src.zip NHibernate二进制文件:NHibernate-3.0.0.Alpha1-bin.zip 特性介绍 N

Aurigma Image Uploader控件免费下载特性介绍使用手册

Aurigma Image Uploader是一个功能强大的图像文件上传控件 该控件可以在客户端执行基本的图像处理:调整大小和旋转90度.缩略图可以使没有经过培训的用户也能方便的上载图像. 产品特征: Image Uploader是一个客户端的ActiveX / JAVA控件,它允许用户在自己的服务器上定位图像,执行基本的图像处理操作,编辑对图像的描述,然后向另一个服务器上载这些图像.它比采用标准HTML方式上载图像要方便得多.此外,它也能自动创建和上载每一幅图像的缩略图. Image Uplo

jdk7和8的一些新特性介绍

jdk7和8的一些新特性介绍 Java代码   本文是我学习了解了jdk7和jdk8的一些新特性的一些资料,有兴趣的大家可以浏览下下面的内容. 官方文档:http://www.oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html 在jdk7的新特性方面主要有下面几方面的增强: 1.jdk7语法上 1.1二进制变量的表示,支持将整数类型用二进制来表示,用0b开头. // 所有整数 int, short,long,byte都可以用二

php7函数,声明,返回值等新特性介绍

使用 ... 运算符定义变长参数函数 (PHP 5 >= 5.6.0, PHP 7) 现在可以不依赖 func_get_args(), 使用 ... 运算符 来实现 变长参数函数. function f($req, $opt = null, ...$params) { // $params 是一个包含了剩余参数的数组 printf('$req: %d; $opt: %d; number of params: %d'."\n", $req, $opt, count($params)