heap //堆
non-heap //非堆(jvm中堆以外的空间–method area,stack)
off-heap //离堆,jvm之外的空间(nio中用到,用的操作系统的空间)
- 一般来说,直接内存的访问速度(读写方面)会快于堆内存
- 在申请内存空间时,堆内存速度高于直接内存
- 直接内存适合申请次数少,访问频繁的场合。 如果内存空间需要频繁申请,则不适合直接内存
NIO
完成高速IO,而无需编写自定义native代码
HeapByteBuffer
directionBuffer
- Unsafe
- 不会占用jvm中堆的空间,但是会占用操作系统空间
Stream vs Block
java io包 基于stream技术,按照一个字节处理
java NIO基于Block,使用分块处理数据,比流更快捷,但是编程不易
Channel
- 打开的连接(硬件,File, Socket,程序)
- Channel和Buffer是NIO的核心对象
- 类似stream,数据通过Channel传输
- 实现:
- FileChannel
- SocketChannel //tcp
- DatagramChannel //udp
Buffer
- 缓冲区数组
- 是容器对象的核心
- 从Channel中读取的数据进入buffer中
- NIO必须通过Buffer完成数据读写,跟踪读写过程
术语:
- mark //标记
- capacity //容量
- limit //限制,第一个不能读写的元素索引
- position //位置,读写下一个元素的索引
- mark <=pos<=limit<=capacity
cliaring //清除
flipping //拍板
rewinding //回绕
HeapByteBuffer
allocateDirect
- 直接字节缓冲区,off-heap(离堆,jvm之外的空间)内存
小结
Memory-Mapped Files
也就是将物理文件(整个或者一部分)映射到内存,通过对内存的读写进而改变物理文件。
这里所占用的内存空间是操作系统的,非jvm
加载文件到内存的用法,如下:
注意:FileChannel需要close
SocketChannels
可配置阻塞与非阻塞
服务端配置非阻塞模式,通过轮询的方式接收客户端
客户端也是可以通过阻塞与非阻塞两种模式进行配置
服务端与客户端通过非阻塞的模式建立成功,形成通道,通道是双向的,都是可以进行读写的。