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