5.doReadMessages接收客户端连接publicclassNioServerSocketChannelextendsAbstractNioMessageChannelimplementsio.netty.channel.socket.ServerSocketChannel{OverrideprotectedintdoReadMessages(List<Object>buf)throwsException{SocketChannelchSocketUtils.accept(javaChannel());try{if(ch!null){buf.add(newNioSocketChannel(this,ch));return1;}}catch(Throwablet){logger.warn("Failedtocreateanewchannelfromanaccept...
2022-08-09 18:56:29 5168浏览 0点赞 0回复 0收藏
4.啊哈!!Bug!!image.pngnetty不论是在本文中处理接收客户端连接的场景还是在处理接收客户端连接上的网络数据场景都会在一个do{....}while(...)循环readloop中不断的处理。同时也都会利用在上一小节中介绍的RecvByteBufAllocator.Handle来记录每次readloop接收到的连接个数和从连接上读取到的网络数据大小。从而在readloop的末尾都会通过allocHandle.continueReading()方法判断是否应该退出readloop循环结束连接的接收流程或者...
2022-08-09 18:56:20 5069浏览 0点赞 0回复 0收藏
3.RecvByteBufAllocator简介Reactor在处理对应Channel上的IO数据时,都会采用一个ByteBuffer来接收Channel上的IO数据。而本小节要介绍的RecvByteBufAllocator正是用来分配ByteBuffer的一个分配器。还记得这个RecvByteBufAllocator在哪里被创建的吗??在《聊聊Netty那些事儿之Reactor在Netty中的实现(创建篇)》一文中,在介绍NioServerSocketChannel的创建过程中提到,对应Channel的配置类NioServerSocketChannelConfig也会随着...
2022-08-09 18:55:47 4638浏览 0点赞 0回复 0收藏
8.数组对象的内存布局前边大量的篇幅我们都是在讨论Java普通对象在内存中的布局情况,最后这一小节我们再来说下Java中的数组对象在内存中是如何布局的。8.1基本类型数组的内存布局基本类型数组内存布局.png上图表示的是基本类型数组在内存中的布局,基本类型数组在JVM中用typeArrayOop结构体表示,基本类型数组类型元信息用TypeArrayKlass结构体表示。数组的内存布局大体上和普通对象的内存布局差不多,唯一不同的是在数组类型...
2022-08-09 18:55:25 4733浏览 0点赞 0回复 0收藏
1.MainReactor处理OPACCEPT事件OPACCEPT事件活跃.png当MainReactor轮询到NioServerSocketChannel上的OPACCEPT事件就绪时,MainReactor线程就会从JDKSelector上的阻塞轮询APIselector.select(timeoutMillis)调用中返回。转而去处理NioServerSocketChannel上的OPACCEPT事件。publicfinalclassNioEventLoopextendsSingleThreadEventLoop{privatevoidprocessSelectedKey(SelectionKeyk,AbstractNioChannelch){finalAbstractNioChann...
2022-08-01 19:32:06 4795浏览 0点赞 0回复 0收藏
对于一个高性能网络通讯框架来说,最最重要也是最核心的工作就是如何高效的接收客户端连接,这就好比我们开了一个饭店,那么迎接客人就是饭店最重要的工作,我们要先把客人迎接进来,不能让客人一看人多就走掉,只要客人进来了,哪怕菜做的慢一点也没关系。本文笔者就来为大家介绍下netty这块最核心的内容,看看netty是如何高效的接收客户端连接的。下图为笔者在一个月黑风高天空显得那么深邃遥远的夜晚,闲来无事,于是捧起Net...
2022-08-01 19:31:46 4401浏览 0点赞 0回复 0收藏
6.ChannelRead事件的响应接收客户端连接.png在前边介绍接收连接的整体核心流程框架的时候,我们提到mainreactor线程是在一个do{.....}while(...)循环readloop中不断的调用ServerSocketChannelaccept方法来接收客户端的连接。当满足退出readloop循环的条件有两个:1.在限定的16次读取中,已经没有新的客户端连接要接收了。退出循环。2.从NioServerSocketChannel中读取客户端连接的次数达到了16次,无论此时是否还有客户端连接都...
2022-08-01 19:30:21 4407浏览 0点赞 0回复 0收藏
7.向SubReactorGroup中注册NioSocketChannelchildGroup.register(child).addListener(newChannelFutureListener(){OverridepublicvoidoperationComplete(ChannelFuturefuture)throwsException{if(!future.isSuccess()){forceClose(child,future.cause());}}});客户端NioSocketChannel向SubReactorGroup注册的流程完全和服务端NioServerSocketChannel向MainReactorGroup注册流程一样。关于服务端NioServerSocketChannel的注册流...
2022-08-01 19:30:06 4852浏览 0点赞 0回复 0收藏
6.为什么要内存对齐我们在了解了内存结构以及CPU读写内存的过程之后,现在我们回过头来讨论下本小节开头的问题:为什么要内存对齐?下面笔者从三个方面来介绍下要进行内存对齐的原因:速度CPU读取数据的单位是根据wordsize来的,在64位处理器中wordsize8字节,所以CPU向内存读写数据的单位为8字节。在64位内存中,内存IO单位为8个字节,我们前边也提到内存结构中的存储器模块通常以64位为单位(8个字节)传输数据到存储控制器上...
2022-07-28 17:53:57 4655浏览 0点赞 0回复 0收藏
5.内存对齐通过以上内容我们了解到Java对象中的实例数据区字段需要进行内存对齐而导致在JVM中会被重排列以及通过填充缓存行避免falsesharding的目的所带来的字节对齐填充。我们也了解到内存对齐不仅发生在对象与对象之间,也发生在对象中的字段之间。那么在本小节中笔者将为大家介绍什么是内存对齐,在本节的内容开始之前笔者先来抛出两个问题:•为什么要进行内存对齐?如果就是头比较铁,就是不内存对齐,会产生什么样的...
2022-07-28 17:53:49 5109浏览 0点赞 0回复 0收藏
4.2FalseSharing(伪共享)我们先来看一个这样的例子,笔者定义了一个示例类FalseSharding,类中有两个long型的volatile字段a,b。publicclassFalseSharding{volatilelonga;volatilelongb;}字段a,b之间逻辑上是独立的,它们之间一点关系也没有,分别用来存储不同的数据,数据之间也没有关联。FalseSharding类中字段之间的内存布局如下:image.pngFalseSharding类中的字段a,b在内存中是相邻存储,分别占用8个字节。如果恰好字段...
2022-07-28 17:53:37 4438浏览 0点赞 0回复 0收藏
3.对齐填充(Padding)在前一小节关于实例数据区字段重排列的介绍中为了内存对齐而导致的字节填充不仅会出现在字段与字段之间,还会出现在对象与对象之间。前边我们介绍了字段重排列需要遵循的三个重要规则,其中规则1,规则2定义了字段与字段之间的内存对齐规则。规则3定义的是对象字段之间的排列规则。为了内存对齐的需要,对象头与字段之间,以及字段与字段之间需要填充一些不必要的字节。比如前边提到的字段重排列的第一种情...
2022-07-28 17:53:27 5023浏览 0点赞 0回复 0收藏
5.使用堆外内存为ByteBuffer分配内存AdaptiveRecvByteBufAllocator类只是负责动态调整ByteBuffer的容量,而具体为ByteBuffer申请内存空间的是由PooledByteBufAllocator负责。5.1类名前缀Pooled的来历在我们使用Java进行日常开发过程中,在为对象分配内存空间的时候我们都会选择在JVM堆中为对象分配内存,这样做对我们Java开发者特别的友好,我们只管使用就好而不必过多关心这块申请的内存如何回收,因为JVM堆完全受Java虚拟机控...
2022-07-28 17:53:13 5720浏览 0点赞 0回复 0收藏
4.3扩缩容逻辑现在扩缩容索引表SIZETABLE已经初始化完毕了,那么当我们需要对ByteBuffer进行扩容或者缩容的时候如何根据SIZETABLE决定扩容多少或者缩容多少呢??这就用到了在AdaptiveRecvByteBufAllocator类中定义的扩容步长INDEXINCREMENT4,缩容步长INDEXDECREMENT1了。我们就以上面两副扩缩容容量索引表SIZETABLE中的容量索引展示截图为例,来介绍下扩缩容逻辑,假设我们当前ByteBuffer的容量索引为33,对应的容量为2048。4...
2022-07-28 17:52:34 6089浏览 0点赞 0回复 0收藏
3.2从NioSocketChannel中读取数据publicclassNioSocketChannelextendsAbstractNioByteChannelimplementsio.netty.channel.socket.SocketChannel{OverrideprotectedintdoReadBytes(ByteBufbyteBuf)throwsException{finalRecvByteBufAllocator.HandleallocHandleunsafe().recvBufAllocHandle();allocHandle.attemptedBytesRead(byteBuf.writableBytes());returnbyteBuf.writeBytes(javaChannel(),allocHandle.attemptedBytesRead(...
2022-07-28 17:52:26 5424浏览 0点赞 0回复 0收藏
3.1分配DirectByteBuffer接收网络数据SubReactor在接收NioSocketChannel上的IO数据时,都会分配一个ByteBuffer用来存放接收到的IO数据。这里大家可能觉得比较奇怪,为什么在NioSocketChannel接收数据这里会有两个ByteBuffer分配器呢?一个是ByteBufAllocator,另一个是RecvByteBufAllocator。finalByteBufAllocatorallocatorconfig.getAllocator();finalRecvByteBufAllocator.HandleallocHandlerecvBufAllocHandle();这两个Byte...
2022-07-28 17:52:00 5711浏览 0点赞 0回复 0收藏
2.1ChannelRead与ChannelReadComplete事件的区别有些小伙伴可能对Netty中的一些传播事件触发的时机,或者事件之间的区别理解的不是很清楚,概念容易混淆。在后面的文章中笔者也会从源码的角度出发给大家说清楚Netty中定义的所有异步事件,以及这些事件之间的区别和联系和触发时机,传播机制。这里我们主要探讨本文主题中涉及到的两个事件:ChannelRead事件与ChannelReadComplete事件。从上述介绍的Netty接收网络数据流程总览中...
2022-07-28 17:51:49 5912浏览 0点赞 0回复 0收藏
2.Netty接收网络数据流程总览我们直接按照老规矩,先从整体上把整个OPREAD事件的逻辑处理框架提取出来,让大家先总体俯视下流程全貌,然后在针对每个核心点位进行各个击破。Netty接收网络数据流程.png流程中相关置灰的步骤为Netty处理连接关闭时的逻辑,和本文主旨无关,我们这里暂时忽略,等后续笔者介绍连接关闭时,会单独开一篇文章详细为大家介绍。从上面这张Netty接收网络数据总体流程图可以看出NioSocketChannel在接收网...
2022-07-28 17:51:39 5472浏览 0点赞 0回复 0收藏
前文回顾在前边的系列文章中,我们从内核如何收发网络数据开始以一个C10K的问题作为主线详细从内核角度阐述了网络IO模型的演变,最终在此基础上引出了Netty的网络IO模型如下图所示:netty中的reactor.png详细内容可回看《从内核角度看IO模型的演变》后续我们又围绕着Netty的主从Reactor网络IO线程模型,在《Reactor模型在Netty中的实现》一文中详细阐述了Netty的主从Reactor模型的创建,以及介绍了Reactor模型的关键组件。搭建...
2022-07-28 17:50:53 4316浏览 0点赞 0回复 0收藏
大家好,我是bin,又到了每周我们见面的时刻了,我的公众号在1月10号那天发布了第一篇文章《从内核角度看IO模型的演变》,在这篇文章中我们通过图解的方式以一个C10k的问题为主线,从内核角度详细阐述了5种IO模型的演变过程,以及两种IO线程模型的介绍,最后引出了Netty的网络IO线程模型。读者朋友们后台留言都觉得非常的硬核,在大家的支持下这篇文章的目前阅读量为2038,点赞量为80,在看为32。这对于刚刚诞生一个多月的小号...
2022-07-28 17:49:43 5084浏览 0点赞 0回复 0收藏