![](https://img-blog.csdnimg.cn/20190918140037908.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Netty源码分析
文章平均质量分 76
了解Netty的工作原理,学习其优秀的设计
zhen_hong
没个性,不签名
展开
-
14、Netty源码系列总结
一、类介绍NioEventLoopGroup:用于创建Nio socket程序的事件轮询组,每个事件轮询都会一个Selector对象ServerBootstrap:构建服务通道,设置tcp参数,绑定端口的辅助类ServerBootstrapAcceptor:服务通道使用,用于接收请求,轮询EventLoop,注册通道到对应的selector上,并设置通道参数,如果有ChannelIniti...原创 2019-10-03 20:14:14 · 192 阅读 · 0 评论 -
13、Netty内存池之PooledByteBufAllocator
一、PooledByteBufAllocator的创建PooledByteBufAllocator顾名思义,就是一个用于分配PooledByteBuf的分配器现在有以下例子程序public class Test { public static void main(String[] args) { PooledByteBufAllocator allocator =...原创 2020-05-03 23:24:15 · 1610 阅读 · 0 评论 -
12、Netty的内存池之PoolArena
一、简介PoolArena从功能上来讲综合了PoolThreadCache与PoolChunk,就像一个门面一样。PoolArenaMetric//当前PoolArean所管理的内存池已被多少个线程缓存int numThreadCaches();//返回tiny类型的数组的长度,默认就是32int numTinySubpages();//返回small类型数组的长度,默认是4...原创 2020-05-03 19:56:02 · 650 阅读 · 0 评论 -
11、Netty的内存池之PoolThreadCache
一、PoolThreadLocalCache在申请池化内存时,netty并不会直接从内存池中申请,而是先从PoolThreadLocalCache获取,同样的release一个ByteBuf时并不会直接归还到内存池,而是先缓存在PoolThreadLocalCache中PoolThreadLocalCache继承了FastThreadLocal,FastThreadLocal类似JDK的Th...原创 2020-05-03 16:06:22 · 1504 阅读 · 0 评论 -
10、Netty内存池之PoolChunk与PoolSubPage
一、原理请移步到《netty的内存池设计》二、PoolChunk与PoolSubPage2.1 PoolChunk2.1.1 简介PoolChunk表示一个内存块,默认16M,用于管理分配内存,以下为PoolChunk的类图PoolChunkMetric:接口,usage方法用于获取PoolChunk的使用率;chunkSize方法返回PoolChunk的大小;freeBytes方...原创 2020-05-02 18:44:47 · 1003 阅读 · 2 评论 -
9、Netty的内存池设计
一、简介netty作为一款优秀的通信框架,不可避免的需要面对频繁的数据读入与写出,此时肯定会导致大量ByteBuf对象的创建,为了减少频繁申请内存带来的开销与gc,netty设计了内存池。二、内存池设计的演化假设让你设计一个内存池,你会怎么设计?也许你会创建一个字节数组,然后分配一定的大小,像下面这样//分配16M的字节数组byte[] memoryPool = new byte[1...原创 2020-05-01 18:58:30 · 1986 阅读 · 1 评论 -
8、Netty的对象池
一、什么是对象池?顾名思义,就是有一个池子装着一群对象。我们需要对象的时候就从池子中取一个出来,用完之后就把对象放回池子中去。这样可以复用对象并且减少创建一个对象的开销,也可以避免申请对象太多导致的频繁gc。从设计模式上来讲,它是一种享元模式。二、netty的对象池netty为了避免过多的创建对象和频繁的gc使用了对象池,在需要创建ByteBuf的时候,从对象池中找,如果没有才会去创建一个...原创 2020-04-28 23:39:57 · 934 阅读 · 0 评论 -
7、Netty的零拷贝之CompositeChannelBuffer
一、类图ChannelBuffer:接口,用于定义设置读索引,写索引,获取字节数据等方法。AbstractChannelBuffer:模板类,实现了操作索引的方法,具体的读取数据的方法交由子类实现。二、字段说明2.1 AbstractChannelBuffer//读索引private int readerIndex;//写索引private int writerIndex;...原创 2020-04-24 22:59:51 · 268 阅读 · 0 评论 -
6、接收请求
在第二小节中我们分析到,父通道接收请求之后NioServerSocketChannel#doReadMessageprotected int io.netty.channel.socket.nio.NioServerSocketChannel#doReadMessages(List<Object> buf) throws Exception { SocketChann...原创 2019-08-11 20:57:03 · 368 阅读 · 0 评论 -
5、ServerBootstrap之端口绑定
上一节讲到通道的绑定和排管,我们来回顾下绑定方法private ChannelFuture io.netty.bootstrap.AbstractBootstrap#doBind(final SocketAddress localAddress) { //初始化和注册通道 final ChannelFuture regFuture = initAndRegiste...原创 2019-08-11 20:51:40 · 1595 阅读 · 0 评论 -
4、ServerBootstrap之通道的创建与注册
一、ServerBootstrap概览在第一节的例子中有以下代码public void bind(int port) { //NIO线程组,Reactor线程组,一个用于接受客户端的请求,另一个用于进行SocketChannel的操作 EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup work...原创 2019-08-11 20:48:02 · 614 阅读 · 0 评论 -
3、NioEventLoopGroup的构建
在前一小节中我们大致浏览了NioEventLoopGroup的类图和与直接相关的类的类图,现在我们直接进入细节代码,分析NioEventLoopGroup的构建下面这段代码,在第一小节我们已经看过了,这里再回顾下public NioEventLoopGroup() { this(0);} | Vpublic NioEventL...原创 2019-08-11 20:42:56 · 167 阅读 · 0 评论 -
2、NioEventLoopGroup概览
下面是一个简单的服务器程序public class TimeServer { public void bind(int port) { //NIO线程组,Reactor线程组,一个用于接受客户端的请求,另一个用于进行SocketChannel的操作 EventLoopGroup bossGroup = new NioEventLoopGroup(); 。。。。。。}...原创 2019-08-10 11:05:00 · 682 阅读 · 0 评论 -
1、源码分析例子
下面用于分析源码的例子摘自《Netty权威指南 第二版》serverpackage com.netty.server;import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.ChannelFuture;import io.netty.channel.ChannelInitializer;import io...原创 2019-08-10 11:00:34 · 126 阅读 · 0 评论