首页 > 编程知识 正文

属于非相关成本的是,什么是缓冲区分析

时间:2023-05-04 19:02:40 阅读:120029 作者:1763

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堆栈,因此直接缓冲区的创建和销毁开销大于堆栈上的非直接缓冲区。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。