allocate(int capacity)
角色创建指定大小的非直接缓冲区对象。 此缓冲区直接在JVM内存中创建。
源代码:
package java.nio;省略. publicabstractclassbytebufferextendsbufferimplementscomparablebytebuffer { .省略. publicstaticbytebufferalllllocate returnnewheapbytebuffer (容量、容量、空值); } .省略. } package java.nio; classheapbytebufferextendsbytebuffer { .省略. heapbytebuffer(intcap、int lim、MemorySegmentProxy segment )//package-。 //非直接缓冲器实质上排列/* hb=new byte[cap]; offset=0; */this.address=array _ base _ offset; (省略) )原理:
说明:
1、读取: Java APP应用程序读取文件时,磁盘文件数据先读取到操作系统内存中,再直接复制到非缓冲区中,然后读取到APP应用程序中;
2、写入: Java APP应用程序写入文件时,首先向非直接缓冲区写入数据,然后写入操作系统存储器,再写入磁盘文件;
allocateDirect(int capacity)
角色创建指定大小的直接缓冲区对象。 此缓冲区直接在物理内存(物理内存映射文件)中创建,而APP应用程序直接处理物理内存映射文件。 这减少了中间复制过程,大大提高了读和写效率
源代码:
package java.nio;省略. publicabstractclassbytebufferextendsbufferimplementscomparablebytebuffer { .省略. publicstaticbytebufferalllocatedededer .省略. classdirectbytebufferextendsmappedbytebufferimplementsdirectbuffer { .省略. directbytebuffer {/int cap }/packap int ps=Bits.pageSize (; longsize=math.max(1L,) long (cap ) pa? ps : 0); bits.reservememory(size,cap ); 龙基=0; try { base=unsafe.allocate memory (size; }catch(outofmemoryerrorx ) bits.unreservememory(size,cap ); throw x; }unsafe.setmemory(base,size,) byte )0); if(pa ) base%PS!=0) (/rounduptopageboundaryaddress=base PS-() base(PS-1 ) ); } else { address=base; }cleaner=cleaner.create(this,newdeallocator ) base,size,cap ); att=空值; (省略) )原理:
说明:
1、读取: Java APP应用程序读取文件时,盘文件数据首先读取到物理内存映射文件中,然后APP应用程序直接从物理内存映射文件中读取数据;
2、写入: Java APP应用程序写入文件时,首先将数据写入物理内存映射文件,然后操作系统直接将物理内存映射文件中的数据写入磁盘文件;
缺点:
1、非直接缓冲区由JVM分配,直接缓冲区由操作系统分配,直接缓冲区绕过JVM堆栈,因此直接缓冲区的创建和销毁开销大于堆栈上的非直接缓冲区。