netty
文章平均质量分 87
sam-123
这个作者很懒,什么都没留下…
展开
-
netty源码阅读之解码之基于长度域解码器参数分析
这篇文章我们放松一点,只分析基于长度域解码器的几个参数,lengthFieldOffset :长度域的偏移量,也就是长度域要从什么地方开始lengthFieldLength:长度域的长度,也就是长度域占多少个字节lengthAdjustment:长度域的值的调整,也就是我们去到长度域里面的值,然后还要做多少调整才是符合要求的,这个值可以是正值,可以是负值,正值表示还要加多少,负值表示还...原创 2018-09-30 18:33:19 · 978 阅读 · 0 评论 -
netty源码阅读之编码之writeAndFlush抽象步骤
我们首先把对象变成字节流,最终写到socket底层的流程 在pipeline中,从tail节点开始传播,业务流程biz这个hander处理完之后,调用writeAndFlush把对象user传递过去;然后有个encode编码器把user编码成bytebuf;最后在head里面把bytebuf变成二进制调用jdk底层的写方法写到网络里面去。我们写了一个用户代码,启动客户端:pu...原创 2018-10-02 11:53:04 · 1272 阅读 · 0 评论 -
netty源码阅读之编码
编码的文章主要有以下几篇:1、writeAndFlush抽象步骤2、抽象编码器MessageToByteEncoder3、写buffer队列4、刷新buffer队列原创 2018-10-02 11:02:09 · 286 阅读 · 0 评论 -
netty源码阅读之解码之基于长度域解码器分析
基于长度域解码器LengthFieldBasedFrameDecoder我们主要分析以下三点:1、计算需要抽取的数据包的长度2、跳过字节逻辑处理3、丢弃模式下的处理首先源码还是LengthFieldBasedFrameDecoder的decode方法: /** * Create a frame out of the {@link ByteBuf} and re...原创 2018-10-01 12:00:52 · 1203 阅读 · 0 评论 -
netty源码阅读之解码之基于固定长度解码器分析
固定长度解码器FixedLengthFrameDecoder比较简单,我们看下它类的注释:/** * A decoder that splits the received {@link ByteBuf}s by the fixed number * of bytes. For example, if you received the following four fragmented p...原创 2018-09-25 16:48:26 · 522 阅读 · 0 评论 -
netty源码阅读之解码之抽象解码器ByteMessageDecoder
ByteMessageDecoder是所有解码器的基类,它主要通过以下步骤进行解码:1、累加字节流2、调用子类的decode方法进行解析3、将解析到的ByteBuf向下传播我们看ByteMessageDecoder的channelRead方法,这个方法就是解码的开始: @Override public void channelRead(ChannelHandle...原创 2018-09-25 16:26:09 · 513 阅读 · 0 评论 -
netty源码阅读之解码
netty编码我们分以下几点分析:1、抽象解码器ByteToMessageDecoder2、基于固定长度解码器分析3、行解码器分析4、基于分隔符解码器分析5、基于长度域解码器参数分析6、基于长度域解码器分析...原创 2018-09-13 11:08:32 · 380 阅读 · 0 评论 -
netty源码阅读之ByteBuf之ButeBuf内存的释放
我们这一篇文章要使用的用户代码如下: public static void main(String[] args) { PooledByteBufAllocator allocator = PooledByteBufAllocator.DEFAULT; ByteBuf byteBuf = allocator.directBuffer(16); ...原创 2018-09-09 23:25:58 · 3660 阅读 · 0 评论 -
netty源码阅读之ByteBuf之缓存分配流程
我们还是先回到PoolArena的allocate方法: private void allocate(PoolThreadCache cache, PooledByteBuf<T> buf, final int reqCapacity) { final int normCapacity = normalizeCapacity(reqCapacity); ...原创 2018-09-06 22:55:20 · 731 阅读 · 0 评论 -
netty源码阅读之ByteBuf之内存subpage级别内存的分配
subpage级别的内存分配的主要方法为:allocateTiny()。主要分为以下三个步骤:1、定位一个subpage对象2、初始化subpage3、初始化pooledByteBuf这一次,我们的用户代码是分配16B的内存public class Test { public static void main(String[] args) { Po...原创 2018-09-09 17:44:22 · 639 阅读 · 0 评论 -
netty源码阅读之ByteBuf之内存page级别内存的分配
我们继续回到PoolArena的分配内存的方法: private void allocate(PoolThreadCache cache, PooledByteBuf<T> buf, final int reqCapacity) { final int normCapacity = normalizeCapacity(reqCapacity); ...原创 2018-09-08 20:39:28 · 767 阅读 · 0 评论 -
netty源码阅读之ByteBuf之内存概念arena、chunk、page、subpage
在PoolThreadCache里面,分两种区域,cache和arena。前面我们讲解了cache,也就是之前存在过,我们直接在cache里面获取或者分配。但是第一次的时候,cache肯定是没有的,所以就要使用到内存区域arena。我们来看源码:final class PoolThreadCache { private static final InternalLogger l...原创 2018-09-07 22:21:11 · 1016 阅读 · 0 评论 -
netty源码阅读之ByteBuf之缓存数据结构
netty分配内存的时候,有缓存和内存。我们下面两节先分析缓存的,分析缓存就要知道缓存数据结构。在这篇文章这里,我们已经知道这里有个MemoryRegionCache,一看就是缓存,那么这个MemoryRegionCache缓存的数据结构是怎么样子的呢?一、缓存的数据结构:我们首先看MemoryRegionCache的定义: private abstract static cl...原创 2018-09-04 15:48:58 · 859 阅读 · 1 评论 -
netty源码阅读之ByteBuf之内存规格的介绍
内存规格大致可以分为tiny、small、normal、huge其中tinyt、small、normal可以缓存、huge由于大于16M了,所以不缓存netty里面,内存单元是以Chunk为单位的向操作系统申请的,一个内存单元16M;但是如果我们要分配10k的内存,用一个chunk就太浪费了。所以chunk下面又有page,一个page的大小8k,所以一个chunk一共有16m/8...原创 2018-09-04 10:12:16 · 544 阅读 · 0 评论 -
netty源码阅读之ByteBuf之ByteBuf结构和重要API
主要分一下几点讲解:1、ByteBuf结构2、read、write、set方法3、mark和reset方法 一、ByteBuf结构我们找到ByteBuf源码,查看最前面的注释,有这样一段: * <pre> * +-------------------+------------------+------------------+ * ...原创 2018-08-22 00:05:10 · 3421 阅读 · 1 评论 -
netty源码阅读之ByteBuf
今天我们开启新的篇章,netty很重要的内存概念将在这一章介绍。ByteBuf主要介绍以下几点:1、内存与内存管理器的抽象2、不同规格大小和不同类别的内存的分配策略3、内存的回收过程学完ByteBuf需要知道以下几个问题:1、内存的类别有哪些?2、如何减少多线程内存分配之间的竞争?一个NioEventLoop里面有一个私有的Arena(其实就是ThreadLocal的原...原创 2018-08-21 21:34:31 · 401 阅读 · 0 评论 -
netty源码阅读之ByteBuf之directArena分配direct内存的流程
流程分为以下几个流程:1、从对象池里面拿到PooledByteBuf进行复用2、从缓存上面进行分配3、从内存堆里面进行内存分配(如果在缓存上分配不成功,就在内存堆里面分配)回到上一节开始的代码: @Override protected ByteBuf newDirectBuffer(int initialCapacity, int maxCapacity) {...原创 2018-08-28 22:09:27 · 775 阅读 · 0 评论 -
netty源码阅读之编码之MessageToByteEncoder
MessageToByteEncoder的write过程,我们分析以下几步:1、匹配对象2、分配内存3、编码实现4、释放对象5、传播数据6、释放内存源码在这里: @Override public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) thro...原创 2018-10-02 18:36:00 · 1122 阅读 · 0 评论 -
netty源码阅读之编码之write写buffer队列
不管我们之前处理没处理我们的对象,也就是说不管我们有没有使用编码器,wriiteAndFlush之后,最终都会调用到headcontext的write和flush方法。我们把这个headcontext的方法分为以下几个步骤:1、direct化ByteBuf2、插入写队列3、设置写状态这是我们headContext的write方法: @Override ...原创 2018-10-06 20:31:02 · 1984 阅读 · 0 评论 -
netty源码阅读之解码之基于分隔符解码器分析
基于分隔符解码器DelimiterBasedFrameDecoder也算是比较简单的,和基于行解码器差不多一样分析既可,首先我们看一个构造函数: public DelimiterBasedFrameDecoder(int maxFrameLength, ByteBuf... delimiters) { this(maxFrameLength, true, delimit...原创 2018-09-30 17:27:05 · 496 阅读 · 0 评论 -
netty源码阅读之解码之行解码器分析
行解码器LineBasedFrameDecoder,我们首先看这个类的一些成员变量:/** * A decoder that splits the received {@link ByteBuf}s on line endings. * <p> * Both {@code "\n"} and {@code "\r\n"} are handled. * For a more...原创 2018-09-29 21:53:23 · 739 阅读 · 0 评论 -
netty源码阅读之性能优化工具类之Recycle异线程获取对象
在这篇《netty源码阅读之性能优化工具类之Recycler获取对象》文章里面,我们还有一个scavenge()方法没有解析,也就是在别的线程里面回收对象。下面我们开始介绍,从这个方法开始进入: boolean scavenge() { // continue an existing scavenge, if any if (s...原创 2018-10-08 19:20:53 · 338 阅读 · 1 评论 -
netty源码阅读之性能优化工具类之Recycle异线程回收对象
异线程回收对象分为以下几点分析:1、获取WeakOrderQueue2、如果WeakOrderQueue获取不到,说明是第一,那就创建WeakOrderQueue3、获取到或者创建完WeakOrderQueue之后,将对象追加到WeakOrderQueue里面我们从这个push开始看代码: void push(DefaultHandle<?> it...原创 2018-10-08 17:38:19 · 459 阅读 · 0 评论 -
netty源码阅读之性能优化工具类之Recycle同线程回收对象
我们从handle的recycle方法开始: @Override public void recycle(Object object) { if (object != value) { throw new IllegalArgumentException("object does not belong to...原创 2018-10-08 12:10:43 · 365 阅读 · 0 评论 -
netty源码阅读之性能优化工具类之Recycler获取对象
Recycler获取对象主要分为以下几部分:1、获取当前线程的Stack2、从Stack里面弹出对象3、如果弹出对象为空,那就创建对象并且绑定到Stack里面我们从Recycler的get方法进入,就是这个源码: @SuppressWarnings("unchecked") public final T get() { if (maxCapac...原创 2018-10-08 11:09:59 · 306 阅读 · 1 评论 -
netty源码阅读之性能优化工具类之Recycler的创建
我们进入到Recycler的构造函数: protected Recycler() { this(DEFAULT_MAX_CAPACITY_PER_THREAD); }然后在这个类里面,有一个threadLocal,里面放了一个stack: private final FastThreadLocal<Stack<T>> th...原创 2018-10-08 10:23:08 · 464 阅读 · 0 评论 -
netty源码阅读之性能优化工具类之Recycler的使用
先看我们一个用户端的代码:public class RecycleTest { private static final Recycler<User> RECYCLER = new Recycler<User>() { @Override protected User newObject(Handle<User> h...原创 2018-10-07 18:02:13 · 466 阅读 · 0 评论 -
netty源码阅读之性能优化工具类之轻量级对象池Recycler
netty里面这个Recycler经常出现,例如在ByteBuf里面,由于我们经常创建很ByteBuf,所以回收利用ByteBuf很有必要。接下去我们就分析下这个Recycler的,主要分以下几部分分析:1、Recycler的使用2、Recycler的创建3、从Recycler里面获取对象4、在同一个线程里面回收对象5、在不同的线程里面回收对象6、在不同的线程里面获取对象...原创 2018-10-07 17:36:29 · 304 阅读 · 0 评论 -
netty源码阅读之性能优化工具类之FastThreadLocal的set方法实现
FastThreadLocal的set方法实现我们从以下三点分析:1、获取ThreadLocalMap2、直接通过索引set对象3、如果需要remove对象,那就remove我们还是从set方法源码开始: /** * Set the value for the current thread. */ public final void set(...原创 2018-10-07 14:55:20 · 327 阅读 · 0 评论 -
netty源码阅读之性能优化工具类之FastThreadLocal的get方法实现
FastThreadLocal的get方法实现我们通过以下三部分分析:1、获取ThreadLocalMap2、直接通过索引找到对象3、如果对象为空,那就初始化对象 我们从FastThreadLocal的get方法进入: /** * Returns the current value for the current thread */ pu...原创 2018-10-07 11:40:32 · 392 阅读 · 0 评论 -
netty源码阅读之性能优化工具类之FastThreadLocal的创建
创建的话我们直接从FastThreadLocal的构造方法进入: public FastThreadLocal() { index = InternalThreadLocalMap.nextVariableIndex(); }可见他是现在这里创建了index,这个index就是每个线程里面FastThreadLocal唯一的标识。看这个nextVari...原创 2018-10-07 10:47:59 · 375 阅读 · 0 评论 -
netty源码阅读之性能优化工具类之FastThreadLocal的使用
先说明FastThreadLocal使用的效果。1、比jdk原生的ThreadLocal的快2、不同线程之间能保证线程安全这是我们的用户代码:public class FastThreadLocalTest { private static FastThreadLocal<Object> threadLocal = new FastThreadLocal<...原创 2018-10-07 10:38:35 · 802 阅读 · 0 评论 -
netty源码阅读之性能优化工具类之FastThreadLocal
jdk的threadLocal我们之前分析过了,那么这个ThreadLocal凭什么说是“fast”呢,接下去我们会分析。分析FastThreadLocal我们又分了一下几部分:1、FastThreadLocal的使用2、FastThreadLocal的创建3、FastThreadLocal的get实现4、FastThreadLocal的set实现 ...原创 2018-10-06 21:24:44 · 362 阅读 · 0 评论 -
netty源码阅读之性能优化工具类
netty为了优化性能可谓是费尽心思了,所以我们必须学习学习,接下去就分析两个性能优化的工具类吧。1、fastThreadLocal2、Recycler原创 2018-10-06 21:19:04 · 695 阅读 · 0 评论 -
netty源码阅读之编码之flush刷新buffer队列
flush也是从headContext的unsafe的flush开始的: @Override public void flush(ChannelHandlerContext ctx) throws Exception { unsafe.flush(); }然后看unsafe的flush: @Ove...原创 2018-10-06 21:15:38 · 765 阅读 · 0 评论 -
netty源码阅读之pipeline之异常的传播
异常的传播,我们分为以下两部分:1、异常的触发链2、异常处理的最佳实践 一、异常的触发链先一句话总结一下:从触发的节点开始传播(包含当前触发节点)首先,照例我们有一个用户代码:public final class Server { public static void main(String[] args) throws Exception { ...原创 2018-08-21 18:10:50 · 6463 阅读 · 0 评论 -
netty源码阅读之ByteBuf之内存分配器PooledByteBufAllocator
那么照例我们从以下两点进行分析吧:1、拿到线程局部缓存PoolThreadCache2、在线程局部缓存的Arena上进行分配我们从PooledByteBufAllocator的newHeapBuffer方法入手: @Override protected ByteBuf newHeapBuffer(int initialCapacity, int maxCapacit...原创 2018-08-27 21:51:31 · 1544 阅读 · 0 评论 -
netty源码阅读之NioEventLoop之NioEventLoop执行-----processSelectedKey()执行
从《netty源码阅读之NioEventLoop之NioEventLoop执行》知道,select之后,就是processSelectedKey()这里我们要学习两点:1、selected keySet的优化2、processSelectedKeysOptimized()执行逻辑 1、selected keySet的优化在《netty源码阅读之NioEventLoop之Ni...原创 2018-08-10 11:41:07 · 1729 阅读 · 3 评论 -
netty源码阅读之NioEventLoop之NioEventLoop执行----select()检查io事件
从《netty源码阅读之NioEventLoop之NioEventLoop执行》的select(wakenUp.getAndSet(false))这个函数开始分析,select的时候,先把wakenUp这个标志位设置为false,也就是现在没有用户唤醒了,并把之前是否被用户唤醒作为oldWakenUp传入,方便以后使用,进入之后的代码为: private void select(boo...原创 2018-08-10 11:03:02 · 1483 阅读 · 0 评论 -
netty源码阅读之NioEventLoop之NioEventLoop执行
在《netty源码阅读之NioEventLoop之NioEventLoop启动》这里,有一个这个方法,就是最终执行的任务:SingleThreadEventExecutor.this.run();看看NioEventLoop的实现: @Override protected void run() { for (;;) { try {...原创 2018-08-10 10:22:59 · 682 阅读 · 0 评论