Netty学习笔记
2022-02-24 23:29:30 0 举报
AI智能生成
Netty学习
作者其他创作
大纲/内容
NIO
优势
优于BIO模型
通过多路复⽤器就可以实现⼀个线程处理多个通道,避免了多线程之间的上下⽂切换导致系统开销
过⼤。
过⼤。
NIO⽆需为每⼀个连接开⼀个线程处理,并且只有通道真正有有事件时,才进⾏读写操作,这样⼤
⼤的减少了系统开销
⼤的减少了系统开销
三大核心组件
Buffer(缓冲区)
在NIO中,所有的读写操作都是基于缓冲区完成的,底层是通过数组实现的,常⽤的缓冲区是
ByteBuffer,每⼀种java基本类型都有对应的缓冲区对象(除了Boolean类型),如:
CharBuffer、IntBuffer、LongBuffer等。
ByteBuffer,每⼀种java基本类型都有对应的缓冲区对象(除了Boolean类型),如:
CharBuffer、IntBuffer、LongBuffer等。
Channel(通道)
在BIO中是基于Stream实现,⽽在NIO中是基于通道实现,与流不同的是,通道是双向的,
既可以读也可以写。
既可以读也可以写。
Selector(选择器/多路复⽤器)
Selector是多路复⽤器,它会不断的轮询注册在其上的Channel,如果某个Channel上发⽣读
或写事件,这个Channel就处于就绪状态,会被Selector轮询出来,然后通过SelectionKey获
取就绪Channel的集合,进⾏IO的读写操作
或写事件,这个Channel就处于就绪状态,会被Selector轮询出来,然后通过SelectionKey获
取就绪Channel的集合,进⾏IO的读写操作
ByteBuf
疑问记录
1、discardReadBytes(); 与clear(); 区别
discardReadBytes 只丢弃已读数据
clear 清空所有,重置索引
使用模式
堆缓冲区(HeapByteBuf)
内存的分配和回收速度比较快,可以被JVM自动回收,缺点是,如果进行socket的IO读写,
需要额外做一次内次复制,将堆内存对应的缓冲区复制到内核Channel中,性能会有一定程度的下降。
由于在堆上被JVM管理,在不被使用时可以快速释放。可以通过ByteBuf.array()来获取byte[]数据。
需要额外做一次内次复制,将堆内存对应的缓冲区复制到内核Channel中,性能会有一定程度的下降。
由于在堆上被JVM管理,在不被使用时可以快速释放。可以通过ByteBuf.array()来获取byte[]数据。
使用模式需要在服务端启动时添加:System.setProperty("io.netty.noUnsafe",true);
在ServerBootstrap 中添加: serverBootstrap.childOption(ChannelOption.ALLOCATOR,UnpooledByteBufAllocator.DEFAULT);
直接缓冲区(DirectByteBuf)(默认使用)
非堆内存,它在对外进行内存分配,相比堆内存,它的分配和回收速度 会慢一些,
但是将它写入或从Socket Channel中读取时,由于减少了一次内存拷贝,速度比堆内存快。
但是将它写入或从Socket Channel中读取时,由于减少了一次内存拷贝,速度比堆内存快。
复合缓冲区(不推荐使用)
顾名思义就是将上述两类缓冲区聚合在一起。Netty提供了一个CompsiteByteBuf,可以将
堆缓冲区和直接缓冲区的数据放在一起,让使用更加方便
堆缓冲区和直接缓冲区的数据放在一起,让使用更加方便
分配
PooledByteBufAllocator
实现了对象的池化,提高性能减少并最大限度地减少内存碎片
UnpooledByteBufAllocator
没有实现对象的池化,每次会生成新的对象实例
收藏
收藏
0 条评论
下一页