Netty
spring、netty、redis、dubbo
叶小希
帅就完事了~
展开
-
Netty为什么不是信号量驱动IO
信号驱动式IO对于TCP套接字产生的作用不大。因为该信号在TCP套接字中产生的过于频繁。以下条件均会导致对一个TCP套接字产生SIGIO信号:监听套接字上某个连接请求已经完成; 某个断连请求已经发起; 某个断连请求已经完成; 某个连接之半已经关闭; 数据到达套接字; 数据已经从套接字发送走; 发生某个异步错误。这么多条件都会触发SIGIO信号,导致应用进程对该信号一头雾水,没法确定套接字具体发生了什么事情。不过可以对TCP监听套接字可以使用SIGIO,因为对于监听套接字,产生SIGIO原创 2021-12-13 19:41:17 · 453 阅读 · 0 评论 -
Netty---ChannelOption
ChannelOption.SO_BACKLOG (一般用于option–>boss) BACKLOG用于构造服务端套接字ServerSocket对象,标识当服务器请求处理线程都处于工作是(用完了),用于临时存放已完成三次握手的请求的队列的最大长度。如果未设置或所设置的值小于1,Java将使用默认值50。 ChannelOption.SO_REUSEADDR (一般用于option–>boss) SO_REUSEADDR 对应的是socket选项中SO_REUSEADDR,这个参数表示允许原创 2021-12-09 15:37:53 · 672 阅读 · 0 评论 -
Netty---Handler线程模型
每个handler都有一个executor,当事件流过的时候会判断是不是自己的executor,如果不是就提交一个任务进去。head和tail的executor是workerGroup里面的。用户自己的handler在添加的时候如果没有指定executor,那么使用的也是workerGroup。此时head、tail和用户自己的handler使用的就是同一个executor。如果此时用户的处理逻辑阻塞,那么等于这个IO线程阻塞,会影响到所有注册到此executor的通道。解决方法就是将耗时任务添加到异步原创 2021-12-09 15:19:32 · 427 阅读 · 0 评论 -
Netty---通道生成
在bind过程,反射构建了NioServerSocketChannel,然后进入init...... channel = channelFactory.newChannel(); init(channel);......init方法主要是设置通道属性,然后添加handlerIniter。 @Override void init(Channel channel) throws Exception { ... ... ... p.原创 2021-12-09 14:54:48 · 597 阅读 · 0 评论 -
Netty--writeAndFlush使用的buf回收
一般我们在handle里面申请一个buf,然后发送出去,这个buf在哪释放呢? @Override protected void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception { ByteBuf buffer = ByteBufAllocator.DEFAULT.directBuffer(4); ctx.writeAndFlush(buffer); }A原创 2021-12-09 14:32:48 · 416 阅读 · 0 评论 -
Netty--read接收数据创建的buf回收
创建地点:NioByteUnsafe#read public final void read() { final ChannelConfig config = config(); final ChannelPipeline pipeline = pipeline(); final ByteBufAllocator allocator = config.getAllocator(); final RecvB原创 2021-12-09 11:29:12 · 149 阅读 · 0 评论 -
Netty---解码器/编码器
示例代码 // 必须先添加解码器/编码器 保证数据流动的顺序正确 ch.pipeline().addLast("decoder", new ProtobufDecoder(BalanceNetProtocol.BasePackage.getDefaultInstance()));原创 2021-12-08 18:02:34 · 906 阅读 · 0 评论 -
Netty -- read过程
NioEventLoop开启seletor循环后,当有key就绪时,会进入processSelectedKeys,最终进入NioEventLoop#processSelectedKey private void processSelectedKey(SelectionKey k, AbstractNioChannel ch) { final AbstractNioChannel.NioUnsafe unsafe = ch.unsafe(); if (!k.is.原创 2021-12-08 18:00:54 · 204 阅读 · 0 评论 -
Netty--selector开启
在注册的时候,最终进入unsafe的register方法,向eventLoop提交了一个任务。eventLoop第一次接受任务的时候就会开启一个线程。 @Override public void execute(Runnable task) { if (task == null) { throw new NullPointerException("task"); } boolean inEventLoop = in原创 2021-12-08 16:56:45 · 172 阅读 · 0 评论 -
Netty---组件说明
channel构建的时候会构建一个pipeline,pipeline含有channel的引用。handler添加的时候会构建一个context,包含着pipeline,所以context-->pipeline-->channel。channel在注册的时候会绑定一个eventLoop。eventLoop绑定一个selector和一个线程。channel就是一个通道,底层就是socket。EventLoopGroup就是eventLoop的集合。...原创 2021-12-07 11:25:40 · 67 阅读 · 0 评论 -
Netty--bind过程
示例代码 serverBootstrap.group(bossGroup, workGroup) // 设置channel工厂 .channel(NioServerSocketChannel.class) .handler(new ChannelInitializer<ServerSocketChannel>() { @Override原创 2021-12-07 10:57:55 · 156 阅读 · 0 评论 -
Netty对象池Recycler---ByteBuf的创建与回收---流程解析
get过程:释放过程:内存泄漏分析:原创 2021-12-02 16:08:18 · 310 阅读 · 0 评论 -
Netty对象池Recycler---ByteBuf的创建与回收---结构介绍
创建原创 2021-12-01 15:08:05 · 296 阅读 · 0 评论 -
Netty内存释放
释放原创 2021-12-01 11:32:06 · 1291 阅读 · 0 评论 -
Netty内存分配---线程缓存分配
cache原创 2021-11-30 17:05:17 · 446 阅读 · 0 评论 -
Netty内存表示---handle与bitMapIds
handle是一个64位的long型。前32位表示属于chunk下的哪个节点。后32位如果不为0,代表是小于一页的内存。那么后32位就是bitMapIds,表示属于哪一页的哪一块位置。bitMapIds前26位代表属于bitMap数组的下标,后6位代表属于long中哪一位。...原创 2021-11-30 17:04:15 · 127 阅读 · 0 评论 -
Netty内存分配---Tiny分配
tt原创 2021-11-30 15:32:59 · 248 阅读 · 0 评论 -
Netty内存分配---Normal分配
xx原创 2021-11-29 17:51:02 · 148 阅读 · 0 评论 -
Netty内存分配一
层级结构首先介绍些netty内存池的层级结构,主要分为Arena、ChunkList、Chunk、Page、Subpage这5个层级,这几个层级的关系由大到小,如下图所示:Arena代表1个内存区域,为了优化内存区域的并发访问,netty中内存池是由多个Arena组成的数组,分配时会每个线程按照轮询策略选择1个Arena进行内存分配。1个Arena由两个PoolSubpage数组和多个ChunkList组成。两个PoolSubpage数组分别为tinySubpa...原创 2021-11-29 17:50:23 · 511 阅读 · 0 评论 -
Netty-FastThreadLocal vs ThreadLocal
11原创 2021-11-22 17:19:26 · 256 阅读 · 0 评论 -
Netty-无锁队列-MpscChunkedArrayQueue
11原创 2021-11-22 15:48:15 · 2027 阅读 · 0 评论 -
Netty---1---NioEventLoopGroup
使用:bossGroup = new NioEventLoopGroup();构造函数NioEventLoopGroup--->MultithreadEventLoopGroup。 protected MultithreadEventExecutorGroup(int nThreads, Executor executor, EventExecutorChooserFactory choo..原创 2021-11-19 18:51:31 · 302 阅读 · 0 评论 -
Netty零拷贝
1:Netty的接收和发送ByteBuffer使用直接内存进行Socket读写,不需要进行字节缓冲区的二次拷贝。如果使用JVM的堆内存进行Socket读写,JVM会将堆内存Buffer拷贝一份到直接内存中,然后才写入Socket中。相比于使用直接内存,消息在发送过程中多了一次缓冲区的内存拷贝。2:Netty的文件传输调用FileRegion包装的transferTo方法,可以直接将文件缓冲区的数据发送到目标Channel,避免通过循环write方式导致的内存拷贝问题。3:Netty提供Composi原创 2021-11-19 17:06:06 · 108 阅读 · 0 评论