直接缓冲区和非直接缓冲区
这里主要想讲讲直接和非直接缓冲区的区别
1.简单介绍
直接缓冲区:在jvm中,字节数组可能不会在内存数组中连续储存,而gc也有可能随时移动这个数组的内存地址。而同时在java中,数组是对象,而对象在不同的jvm中实现的存储方式个不一样,基于这个原因,就诞生了直接缓冲区这个概念,通过固有代码来告诉操作系统进行直接释放或者填充数组的操作。如果你向通道传入一个非直接缓冲区对象用于写操作,那么可能会隐含的进行一下操作:
i.生成一个临时的直接ByteBuffer缓冲区
ii.将非直接缓冲区中的内容写入第一步生成的直接缓冲区中
iii.使用临时缓冲区进行底层次的IO操作
iv.这个临时缓冲区使用完毕,被系统销毁
但是有一点,就是在创建和销毁直接缓冲区的时候开销会大大高于非直接缓冲区,也就是说如果在一个可以重复使用的地方,可以直接将缓冲区声明成直接缓冲区,这样会使效率有较大的提升。
2.生成方法:
直接缓冲区:allocateDirect(capacity)
非直接缓冲区:allocate(capacity),wrap(byte[]);