zoukankan      html  css  js  c++  java
  • 【IO】- 关于ByteBuffer的一点认识

    我们经常使用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即可。

  • 相关阅读:
    [BZOJ1143/2718]祭祀river/毕业旅行
    [BZOJ4403]序列统计
    [BZOJ2006][NOI2010]超级钢琴
    [BZOJ2005][NOI2010]能量采集
    [BZOJ3631][JLOI2014]松鼠的新家
    第一个spring,总结!
    第一个spring,第五天。
    第一次spring,第三天。
    第一个spring,第一天。
    软件工程课程设计——第一个Spring
  • 原文地址:https://www.cnblogs.com/lixusign/p/3754143.html
Copyright © 2011-2022 走看看