直接缓冲区

原创转载请注明出处:http://agilestyle.iteye.com/blog/2360210

直接缓冲区( ByteBuffer.allocateDirect() )

(1)通道只接收  ByteBuffer 作为参数

(2) 操作系统的在内存区域中进行 I/O 操作。就操作系统方面而言, 这些内存区域是相连的字节序列 。于是, 只有字节缓冲区有资格参与I/O 操作 。操作系统会直接存取 JVM 进程的内存空间,以传输数据。这意味着 I/O 操作的目标内存区域必须是连续的字节序列。 在 JVM 中,字节数组可能不会在内存中连续存储 ,或者无用存储单元收集可能随时对其进行移动。在 Java 中, 数组是对象,而数据存储在对象中的方式在不同的JVM 实现中都各有不同。

引入了直接缓冲区的概念。 直接缓冲区被用于与通道和固有 I/O 例程交互。

(3)直接缓冲区是I/O 的最佳选择,但可能比创建非直接缓冲区要花费更高的成本。直接缓冲区使用的内存是通过调用本地操作系统方面的代码分配的,绕过了标准 JVM 堆栈。 建立和销毁直接缓冲区会明显比具有堆栈的缓冲区更加破费, 这取决于主操作系统以及 JVM 实现。 直接缓冲区的内存区域不受无用存储单元收集支配,因为它们位于标准JVM堆栈之外。

直接缓冲区是通过调用具有所需容量的  ByteBuffer.allocateDirect() 函数产生的, 注意用一个 wrap()函数所创建的被包装的缓冲区总是非直接的。

Reference

http://www.tuicool.com/articles/mINJve

猜你喜欢

转载自agilestyle.iteye.com/blog/2360210