缓冲区

作者: lsh的学习笔记 | 来源:发表于2020-05-13 21:22 被阅读0次

直接缓冲区

为什么要用直接缓冲区?

因为,操作系统进行 I/O 操作的目标内存区域必须是连续的字节序列。(因此只有字节缓冲区有资格参与 I/O 操作)

但是,在 JVM 中,字节数组元素可能不会在堆中连续存储,或者 GC 可能随时对其进行移动。出于这一原因,引入了直接缓冲区的概念。

非直接字节缓冲区可能导致性能损耗。通常非直接缓冲不可能成为一个本地 I/O 操作的目标。如果您向一个通道中传递一个非直接 ByteBuffer 对象用于写入,通道可能会在每次调用中隐含地进行下面的操作:

  1. 创建一个临时直接 ByteBuffer 对象。
  2. 非直接缓冲区的内容复制到临时直接缓冲区。
  3. 使用临时直接缓冲区执行低层次 I/O 操作。
  4. 临时直接缓冲区对象离开作用域,并最终成为被回收的无用数据。

也就是说底层会用直接缓冲区中转。这可能导致缓冲区在每个 I/O 上复制并产生大量对象,而这种事都是我们极力避免的。

当然,依靠工具,事情可以不这么糟糕。运行时可能会缓存并重新使用直接缓冲区或者执行其他一些聪明的技巧来提高吞吐量。如果您仅仅为一次使用而创建了一个缓冲区,区别并不是很明显。另一方面,如果您将在一段高性能脚本中重复使用缓冲区,分配直接缓冲区并重新使用它们会使您游刃有余。

直接缓冲区时 I/O 的最佳选择,但可能比创建非直接缓冲区要花费更高的成本。直接缓冲区使用的内存是通过系统调用分配的,绕过了标准 JVM 堆栈。系统调用很影响性能,所以,建立和销毁直接缓冲区会明显比具有堆栈的缓冲区更加破费,这取决于主操作系统以及 JVM 实现。 直接缓冲区的内存区域不受 GC 控制,因为它们位于标准 JVM 堆栈之外。

相关文章

  • OpenGL模板缓冲区与模板测试(转)

    OpenGL模板缓冲区与模板测试 帧缓冲区有许多缓冲区构成,这些缓冲区大致分为: 颜色缓冲区:用于绘图的缓冲区,它...

  • OutputStream 输出流 写

    // 带写缓冲区,缓冲区大小10,缓冲区内存中, 1,2,3,4把他们都放到缓冲区--缓冲区满是才写到文件 // ...

  • Socket缓冲区以及阻塞模式

    socket缓冲区每个 socket 被创建后,都会分配两个缓冲区,输入缓冲区和输出缓冲区。write()/sen...

  • 循环缓冲区

    参考 圆形缓冲区(循环buffer)实现35.Linux-分析并制作环形缓冲区 环形缓冲区构成一般的,圆形缓冲区需...

  • 11.18

    Java 中,直接缓冲区与非直接缓冲器有什么区别?非直接缓冲区:通过allocate()分配缓冲区,将缓冲区建立在...

  • [Java NIO] 缓冲区

    一.缓冲区 2.1 缓冲区 1.概念 缓冲区以及缓冲区如何工作,是所有IO的基础。 所谓输入/输出,无非是把数据移...

  • OpenGL ES 3.0(六)缓冲区对象、PBO、FBO

    缓冲区对象 创建: 绑定: 缓冲区对象的绑定点有: 删除: 填充缓冲区: 在使用 glBufferData 之前,...

  • mmap和sendfile

    mmap mmap主要实现方式是将读缓冲区的地址和用户缓冲区的地址进行映射,内核缓冲区和应用缓冲区共享,从而减少了...

  • WEBGL编程指南之缓冲区的使用

    1. 创建缓冲区的步骤 创建缓冲区对象(gl.createBuffer()) 绑定缓冲区对象(gl.bindBuf...

  • 【RTOS训练营】环形缓冲区、AT指令、预习安排和晚课提问

    一、环形缓冲区 在上一次课中,只讲了UART的硬件协议,没有讲环形缓冲区。 本节课就讲解环形缓冲区。 环形缓冲区它...

网友评论

      本文标题:缓冲区

      本文链接:https://www.haomeiwen.com/subject/qfaonhtx.html