java 中Buffer源码的分析
Buffer的类图如下:除了Boolean,其他基本数据类型都有对应的Buffer,但是只有ByteBuffer才能和Channel交互。只有ByteBuffer才能产生Direct的buffer,其他数据类型的Buffer只能产生Heap类型的Buffer。JVM在需要通过操作系统调用完成IO操作,比如可以通过read系统调用完成文件的读取。read的原型是:Buffer分为Direct和Heap两类,下面分别说明这两类buffer。Heap类型的Buffer存在于JVM的堆上,这部分内存的回收与整理和普通的对象一样。但是Heap类型的Buffer不能作为缓冲区参数直接进行系统调用,主要因为下面两个原因。这造成很低的效率,主要是因为两个原因:。使用传入的数组的一部分作为底层缓冲区,变更数组的对应部分会影响缓冲区,变更缓冲区也会影响数组。ByteBuffer.allocateDirect()源码如下:DirectByteBuffer()源码如下:unsafe.allocateMemory()的源码在openjdk/src/openjdk/hotspot/src/share/vm/prims/unsafe.cpp中。
下载地址
用户评论