我们经常使用ByteBuffer。

通俗的Non-DerictedByteBuffer结构如下

HeapByteBuffer extends ByteBuffer {

Byte[] array;

int pos,limit,cap,mark;

}

通俗的DirectByteBuffer结构如下

DirectByteBuffer extends ByteBuffer {

int address;

int pos,limit,cap,mark;

}

可见直接缓冲使用的是JNI的一个内存地址,因此在释放Buffer时,通过gc是无法释放的,需要JNI。

DirectByteBuffer 的好处是什么呢?

一般的nonDirectBuffer-socket通讯过程中需要,socket -> DirectByteBuffer -> UserheapByteBuffer -> DirectByteBuffer -> socket

因此需要2次copy. copy本身不耗费多长时间,但是建立DirectByteBuffer的时间比较久(JNI调用)。而是用DirectByteBuffer的通讯过程如下

socket -> UserDirectByteBuffer -> socket 可见基本是0-copy (如netty中的compositeBuffer)。

而且在做socketChannel中的

write(ByteBuffer) 和 read(ByteBuffer) 两个方法中 sun的实现已经缓存了所需要的DirectByteBuffer

而 write(ByteBUffer[]) 和 read(ByteBuffer[]) 这种聚集Buffer操作则每次都需要大量时间重新创建DirectByteBuffer

因此当网络IO规模大的时候建议使用DirectBuffer,其他一般情况使用NonDirectBuffer即可。

【IO】- 关于ByteBuffer的一点认识的更多相关文章

  1. 小师妹学IO系列文章集合-附PDF下载

    目录 第一章 IO的本质 IO的本质 DMA和虚拟地址空间 IO的分类 IO和NIO的区别 总结 第二章 try with和它的底层原理 简介 IO关闭的问题 使用try with resource ...

  2. 简单聊下IO复用

    没图,不分析API Java中IO API的发展:Socket -> SocketChannel -> AsynchronousSocketChannelServerSocket -> ...

  3. 通过与Quickbuild和Mist.io的持续集成实现云管理和使用监控

    欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 这篇文章由巴拉克·梅里莫维奇撰写. 总结我自己有关Openstack的各种骚操作先告一段落.这一次我想谈谈有关监控云服务的使用情况. 我个人使用 ...

  4. 《Windows核心编程系列》十谈谈同步设备IO与异步设备IO之异步IO

    同步设备IO与异步设备IO之异步IO介绍 设备IO与cpu速度甚至是内存访问相比较都是比较慢的,而且更不可预测.虽然如此,通过使用异步设备IO我们仍然能够创造出更高效的程序. 同步IO时,发出IO请求 ...

  5. 高级Java面试总结3

    1,java堆,分新生代老年代,新生代有Eden,from surviver,to surviver三个空间,堆被所有线程共.eden内存不足时,发生一次minor GC,会把from survivo ...

  6. 33.2.NIO

    4.1概述[理解] BIO Blocking IO,阻塞型IO NIO No Blocking IO,非阻塞型IO 阻塞IO的弊端 在等待的过程中,什么事也做不了 非阻塞IO的好处 不需要一直等待,当 ...

  7. 关于如何提高Web服务端并发效率的异步编程技术

    最近我研究技术的一个重点是java的多线程开发,在我早期学习java的时候,很多书上把java的多线程开发标榜为简单易用,这个简单易用是以C语言作为参照的,不过我也没有使用过C语言开发过多线程,我只知 ...

  8. Netty In Action

    1 introduction 1.2 Asynchronous by design two most common ways to work with or implement an asynchro ...

  9. 缓解 SQL Server has encountered 727 occurrence(s) of I/O requests taking longer than 15 seconds

    sql server 会记录IO等待时间超过15 seconds的请求,这时application会有 time out 现象,dba需要判断是workload,concurrecy 所致还是sql ...

随机推荐

  1. MS SQL Server2012中的EOMONTH函数

    MS SQL Server2012中的EOMONTH函数   这个函数是获取一个指定日期所在月份最后一天的日期.可以得到某一个月月份的最后一天 如: declare @orderdate date=' ...

  2. 为什么选择使用Spring Cloud而放弃了Dubbo

    为什么选择使用Spring Cloud而放弃了Dubbo 可能大家会问,为什么选择了使用Dubbo之后,而又选择全面使用Spring Cloud呢?其中有几个原因: 1)从两个公司的背景来谈:Dubb ...

  3. QWidget切换

    QWidget切换,参考类:QstackedLayout,QStackedWidget,QTabWidget 一.Tab出现的位置 tabWidget.setTabPosition(QTabWidge ...

  4. PHPExcel导出插入图片和居中问题

    首先到网上先下载PHPExcel 下载后解压得到这两个文件 下载后引用该文件 最后编写相关代码: 首先是图片插入导出 $objDrawing = new PHPExcel_Worksheet_Draw ...

  5. ChemDraw使用不了怎么办

    ChemDraw作为一款专业级的化学绘图软件,不仅可以帮助用户绘制图像在数据计算方面也起了很大作用,因此,ChemDraw非常受用户的欢迎.但是我们在使用过程中难免会遇到各种问题,特别是对于新手用户, ...

  6. React Native开发技术

    http://www.lcode.org/react-native-week-issue22/

  7. PHP正则表达式 /i, /s, /x,/u, /U, /A, /D, /S等模式修饰符

    i (PCRE_CASELESS) 如果设置了这个修饰符, 模式中的字母会进行大小写不敏感匹配. m (PCRE_MULTILINE) 默认情况下, PCRE认为目标字符串是由单行字符组成的(然而实际 ...

  8. sap screen design

    定义屏幕:     SAP 系统中的屏幕包含:         标准屏幕:         选择屏幕:         列表输出屏幕: 1. 标准屏幕必须隶属于一个类型为 L, M 或 F 的ABAP ...

  9. Hadoop1.2.1 启停的Shell 脚本分析

    停止shell脚本以此类推.

  10. 数据库为什么要用B+树结构--MySQL索引结构的实现(转)

    B+树在数据库中的应用 { 为什么使用B+树?言简意赅,就是因为: 1.文件很大,不可能全部存储在内存中,故要存储到磁盘上 2.索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数(为什么使用B-/ ...